From e35f6bd31fc5b71b8fe07732f842285a14d61e9b Mon Sep 17 00:00:00 2001 From: Akuli Date: Sat, 11 May 2019 12:54:20 +0300 Subject: [PATCH 1/2] more classes --- README.md | 3 +- basics/README.md | 3 +- basics/answers.md | 108 +++++++ basics/classes.md | 2 +- basics/docstrings.md | 2 +- basics/more-classes.md | 518 ++++++++++++++++++++++++++++++ images/drawings.odg | Bin 26831 -> 26925 bytes images/stuff-global-and-local.png | Bin 0 -> 9493 bytes 8 files changed, 632 insertions(+), 4 deletions(-) create mode 100644 basics/more-classes.md create mode 100644 images/stuff-global-and-local.png diff --git a/README.md b/README.md index feef6cc..7812680 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,8 @@ to learn more about whatever you want after studying it. 18. [Modules](basics/modules.md) 19. [Exceptions](basics/exceptions.md) 20. [Classes](basics/classes.md) -21. [Docstrings](basics/docstrings.md) +21. [More Classes](basics/more-classes.md) +22. [Docstrings](basics/docstrings.md) ### Advanced diff --git a/basics/README.md b/basics/README.md index 24f8547..2dbbbcc 100644 --- a/basics/README.md +++ b/basics/README.md @@ -26,7 +26,8 @@ to learn more about whatever you want after studying it. 18. [Modules](modules.md) 19. [Exceptions](exceptions.md) 20. [Classes](classes.md) -21. [Docstrings](docstrings.md) +21. [More Classes](more-classes.md) +22. [Docstrings](docstrings.md) *** diff --git a/basics/answers.md b/basics/answers.md index de739c3..25c7a5a 100644 --- a/basics/answers.md +++ b/basics/answers.md @@ -433,6 +433,114 @@ isn't exactly like mine but it works just fine it's ok, and you can >>> ``` + +## More Classes + +1. Delete all global variables, and use arguments and return values. We also + need to handle the `len(words) == 0` case differently, and returning `None` + makes sense now. + + ```python + import random + + + # returns None if the sentence contains 0 words + def change_words_order(sentence): + no_dots_sentence = sentence.replace('.', '') + words = no_dots_sentence.split() + if len(words) == 0: + return None + + lowercase_words = [] + for word in words: + lowercase_words.append(word.lower()) + random.shuffle(lowercase_words) + + # in lowercase_words[0], first character uppercase, rest lowercase + # note that empty_list_or_empty_string[0] doesn't work + # lowercase_words is not empty because len(words) == 0 was handled separately + # lowercase_words[0] is not empty because it came from .split() + lowercase_words[0] = lowercase_words[0][0].upper() + lowercase_words[0][1:] + return ' '.join(lowercase_words) + '.' + + + def main(): + print("This program changes the order of the words of a sentence randomly.") + print() + + while True: + sentence = input('Enter a sentence: ') + new_sentence = change_words_order(sentence) + if new_sentence is not None: + print(new_sentence) + + if __name__ == '__main__': + main() + ``` + +2. This answer doesn't contain any code because I haven't seen your + program, and I don't know what your program does. You can + [show your program to me](../contact-me.md) if you want to. + + If your program is short, the cleaned program that uses arguments and + return values is probably cleaner. + +3. See 2. + +4. One way is to replace all the allowed characters with empty strings (delete + them), and see what is left. Of course, add `import string` to the beginning + of the program. + + ```python + bad_characters = user_name + for good_character in (string.ascii_letters + string.digits + '-'): + bad_characters = bad_characters.replace(good_character, '') + + if bad_characters != '': + return "Username must not contain these characters: " + bad_characters + ``` + + For phone numbers, you need to decide how they have to be entered. The code + below accepts `xxx-xxx-xxxx`, where each `x` means a digit. The code ended + up being quite long, so I put it to a separate function. + + I'm assuming that all phone numbers are 10 digits long. This is probably + wrong, and in a real program you should instead figure out what's the + correct way to validate a phone number, or find someone else's code that + does it correctly and use that. + + ```python + def validate_phone_number(phone_number): + # split 'xxx-yyy-zzzz' to ['xxx', 'yyy', 'zzzz'] + parts = phone_number.split('-') + if len(parts) != 3: + return False + if len(parts[0]) != 3 or len(parts[1]) != 3 or len(parts[2]) != 4: + return False + + for part in parts: + for character in part: + if character not in string.digits: + return False + + return True + ``` + + Now you can use this function like this: + + ```python + if not validate_phone_number(self.work_phone_number): + return "work phone number must be entered as xxx-xxx-xxxx" + if not validate_phone_number(self.personal_phone_number): + return "personal phone number must be entered as xxx-xxx-xxxx" + ``` + + It's also important to tell the user how to enter the phone numbers. + For example, you can replace `input("Work phone number: ")` with + `input("Work phone number (xxx-xxx-xxxx, each x is a digit): ")` or + something like that. + + *** If you have trouble with this tutorial please [tell me about diff --git a/basics/classes.md b/basics/classes.md index 3c1f27d..ef97370 100644 --- a/basics/classes.md +++ b/basics/classes.md @@ -424,5 +424,5 @@ star](../README.md#how-can-i-thank-you-for-writing-and-sharing-this-tutorial). You may use this tutorial freely at your own risk. See [LICENSE](../LICENSE). -[Previous](exceptions.md) | [Next](docstrings.md) | +[Previous](exceptions.md) | [Next](more-classes.md) | [List of contents](../README.md#basics) diff --git a/basics/docstrings.md b/basics/docstrings.md index bbebfa3..96b3903 100644 --- a/basics/docstrings.md +++ b/basics/docstrings.md @@ -226,5 +226,5 @@ star](../README.md#how-can-i-thank-you-for-writing-and-sharing-this-tutorial). You may use this tutorial freely at your own risk. See [LICENSE](../LICENSE). -[Previous](classes.md) | [Next](../advanced/datatypes.md) | +[Previous](more-classes.md) | [Next](../advanced/datatypes.md) | [List of contents](../README.md#basics) diff --git a/basics/more-classes.md b/basics/more-classes.md new file mode 100644 index 0000000..71c5253 --- /dev/null +++ b/basics/more-classes.md @@ -0,0 +1,518 @@ +# More Classes + +Read the [classes](classes.md) and +[writing a larger program](larger-program.md) chapters if you haven't read them +yet. In this chapter you'll learn how to use classes when writing larger +programs, and how to avoid things that cause problems when you want to write +larger programs. + + +## Global + +Python has a `global` keyword. I haven't talked about it before, and that is +for a reason. Let's look at this: + +```python +>>> stuff = 1 +>>> def set_stuff(): +... stuff = 2 +... +>>> set_stuff() +>>> stuff # this did NOT change to 2 +1 +>>> +``` + +The problem is that `stuff` is a +[local variable](defining-functions.md#locals-and-globals) inside the +`set_stuff` function. There are actually two variables called `stuff`; the +local `stuff` in `set_stuff`, and the global `stuff`: + +![Global scope: stuff = 1. Local scope inside global scope: stuff = 2.](../images/stuff-global-and-local.png) + +Of course, this is bad style because it's very confusing. To fix this, you +"can" use `global` like this (but **that's not the best way to fix it**, +see below): + +```python +def set_stuff(): + global stuff + stuff = 2 +``` + +Now the global `stuff` variable gets changed instead of creating a new variable. +Note that you only need `global` when **setting** a variable. This function +doesn't need `global`, and it's unnecessary to use `global` here: + +```python +def show_stuff(): + # global is not needed here, don't put it here + print('The stuff is:', stuff) +``` + +**Using global variables is bad** in general. To see why, look at this program: + +```python +# THIS CODE IS BAD + +def ask_name(): + global name + name = input("Enter your name: ") + +def create_message(): + global message + message = "Hello" + name + +def show_message(): + print(message) + +def main(): + ask_name() + create_message() + show_message() + +if __name__ == '__main__': + main() +``` + +The `__name__ == '__main__'` thing is explained +[here](larger-program.md#the-main-function). The code would be much simpler +without functions, but imagine that each function is about 20 lines long. Then +the code would be much harder to understand if it wasn't divided into multiple +functions. + +This code doesn't work correctly, and our job is to figure out which line is +wrong. If you run it and enter `Blah` when it asks for the name, it prints +`HelloBlah` instead of `Hello Blah`. Let's guess that `create_message()` is +broken, and try to run just that function without running anything else: + +```python +>>> import globalprogram # the program must be saved to globalprogram.py +>>> globalprogram + +>>> globalprogram.create_message() +Traceback (most recent call last): + File "", line 1, in + File "/home/akuli/globalprogram.py", line 9, in create_message + message = "Hello" + name +NameError: name 'name' is not defined +>>> +``` + +This didn't work at all because `ask_name()` should have created the `name` +variable, but we wanted to run `create_message()` without `ask_name()`. This is +bad, because now we need to use `ask_name()` if we want to do anything at all +with `create_message`. This may not seem very bad, but imagine what happens if +`ask_name` was instead something that took about 10 minutes to complete, or +something that you don't want to run for some other reason. Also, if +we use `ask_name` and `create_message` and it doesn't work, we don't know which +function has the problem unless we can somehow run one of them without the +other. + +Next, imagine that someone sent you this code, and you have never seen it +before. If you look at the code of `create_message`, can you figure out which +things it needs to run, and what it produces as a result? These things are +important when you are trying to understand code that you have never seen +before. You need to read these 2 lines of code in it to figure it out... + +```python +global message +message = "Hello" + name +``` + +...and notice that they use `name` and set `message`. Again, this might not +seem very bad, but imagine the same thing with 10 functions that do stuff with +20 different variables instead of 3 functions that do stuff with 2 variables. +Each function could also contain much more lines of code. + +If you still don't believe that global variables are bad, search for +`python why are global variables bad`. Some of the reasons you will find show +up mostly in large projects, so I don't have good and short examples of them +here, but I want to teach you to do things in ways that also work well when +your projects get larger. + + +## Avoiding global variables with arguments and return values + +Now you have seen why global variables are bad, so let's +[write the code with arguments and return values](larger-program.md) +instead of global variables. + +```python +# this code is not bad + +def ask_name(): + name = input("Enter your name: ") + return name + +def create_message(name): + message = "Hello" + name + return message + +def show_message(message): + print(message) + +def main(): + name = ask_name() + message = create_message(name) + show_message(message) + +if __name__ == '__main__': + main() +``` + +The code still prints `HelloBlah` instead of `Hello Blah`, but now we can +figure out where the problem is. Let's try running `create_message` again: + +```python +>>> import globalprogram # the program must be saved to globalprogram.py +>>> globalprogram + +>>> globalprogram.create_message() +Traceback (most recent call last): + File "", line 1, in +TypeError: create_message() missing 1 required positional argument: 'name' +>>> +``` + +We got an error again, but this time the error tells us exactly what's wrong: + +```python +>>> globalprogram.create_message('Blah') +'HelloBlah' +``` + +Now we know that `create_message` is broken, and to see why, we can try running +some of the code inside it: + +```python +>>> "Hello" + "Blah" +'HelloBlah' +>>> "Hello " + "Blah" +'Hello Blah' +>>> +``` + +Now we know how to fix the code. We just need to replace `"Hello"` with +`"Hello "` to get a space before the name, and it'll work better. + + +## Avoiding global variables with a class + +Arguments and return values work well for small programs, but what if your +program is bigger? For example, this program asks lots of information from the +user, checks whether it's correctly entered, and if it is, it writes it to a +file. + +```python +# THIS CODE IS BAD + +def ask_user_info(): + global user_name + global full_name + global room_number + global work_phone_number + global personal_phone_number + + user_name = input("User name: ") + full_name = input("Full name: ") + room_number = input("Room number: ") + work_phone_number = input("Work phone number: ") + personal_phone_number = input("Personal phone number (a phone number not for work): ") + + +# returns an error message, or None if everything is ok +def validate_user_info(): + if (user_name == '' or + full_name == '' or + room_number == '' or + work_phone_number == '' or + personal_phone_number == ''): + return "something was left blank" + + try: + if int(room_number) <= 0: + # room_number is '0', or negative (e.g. '-2') + return "room number is negative" + except ValueError: + # int() failed, room_number is e.g. 'lol' + return "room number is not an integer" + + if ' ' in user_name: + return "username contains a space" + if '/' in user_name: + return "username contains a slash" + + return None + + +def create_user_info_file_name(): + global file_name + file_name = 'user_info_' + user_name + '.txt' + + +def display_user_info(): + print("User name:", user_name) + print("Full name:", full_name) + print("Room number:", room_number) + print("Work phone number:", work_phone_number) + print("Personal phone number:", personal_phone_number) + + +def write_user_info_to_file(): + print("Writing to file:", file_name) + with open(file_name, 'w') as f: + print('user_name =', user_name, file=f) + print('full_name =', full_name, file=f) + print('room_number =', room_number, file=f) + print('work_phone_number =', work_phone_number, file=f) + print('personal_phone_number =', personal_phone_number, file=f) + + +def main(): + while True: + ask_user_info() + error = validate_user_info() + if error is None: + break + + print() + print("Error:", error) + print("Please try again.") + print() + + print() + print("Here's the information you entered:") + display_user_info() + print() + + create_user_info_file_name() + write_user_info_to_file() + + +if __name__ == '__main__': + main() +``` + +The code is quite long because **classes are not usually needed for smaller programs**. +If you can return things and take arguments instead, do that. It +won't work very well in this case, because the code would end up looking like +this: + +```python +def ask_user_info(): + ... + return (user_name, full_name, room_number, work_phone_number, personal_phone_number) + +def validate_user_info(user_name, full_name, room_number, work_phone_number, personal_phone_number): + ... + +def display_user_info(user_name, full_name, room_number, work_phone_number, personal_phone_number): + ... +``` + +That's annoying. We don't want that. Let's use a class instead. + +- We had too many variables, so we'll put all of them into a class: + + ```python + class UserInfo: + + def __init__(self, user_name, full_name, room_number, work_phone_number, personal_phone_number): + self.user_name = user_name + self.full_name = full_name + self.room_number = room_number + self.work_phone_number = work_phone_number + self.personal_phone_number = personal_phone_number + ``` + +- `ask_user_info` can now return a `UserInfo` object: + + ```python + def ask_user_info(): + return UserInfo( + user_name=input("User name: "), + full_name=input("Full name: "), + room_number=input("Room number: "), + work_phone_number=input("Work phone number: "), + personal_phone_number=input("Personal phone number (a phone number not for work): "), + ) + ``` + +- `validate_user_info` can be a method of the `UserInfo` class. This way it's + also obvious that it does something with user info, so we can call it + `validate` instead of `validate_user_info`. + + ```python + class UserInfo: + ... + def validate(self) + if (self.user_name == '' or + self.full_name == '' or + self.room_number == '' or + ... + ``` + +- `create_user_info_file_name` can return the file name. + + There's no reason why + you couldn't also use arguments and return values when you use a class. Use + whatever is easiest. In this case, setting the file name to + `self.file_name` or something would mean that the method has to be called + before `self.file_name` is used anywhere. That would give the same problem + that we had earlier with global variables not being defined. This doesn't + happen with other `self.something` attributes because they are defined in + `__init__`, so they are never missing. + + I'll also rename the method to `get_file_name` instead of e.g. + `create_file_name` to give the reader of the code a hint that it might + return the file name. + + ```python + class UserInfo: + ... + def get_file_name(self): + return 'user_info_' + self.user_name + '.txt' + ... + ``` + +- `display_user_info` and `write_user_info_to_file` can be converted to methods + just like `validate_user_info`. I'll call them `display` and `write_to_file`. + My `write_to_file` method uses `self.get_file_name()` instead of `file_name`, + but it could also take `file_name` as an argument. Both ways are good. + + ```python + class UserInfo: + ... + def write_to_file(self): + file_name = self.get_file_name() + print("Writing to file:", file_name) + with open(file_name, 'w') as f: + ... + ``` + +- `main` needs to be modified more: + + ```python + def main(): + while True: + user_info = ask_user_info() + error = user_info.validate() + if error is None: + break + + print() + print("Error:", error) + print("Please try again.") + print() + + print() + print("Here's the information you entered:") + user_info.display() + print() + + user_info.write_to_file() + ``` + +Now we have a program that doesn't use global variables. If it doesn't work, +you can import it and try out all the things as usual, and figure out what's +wrong: + +```python +>>> import userinfo +>>> info = userinfo.UserInfo('a', 'b', 'lol', '123-456-7890', '123-456-7890') +>>> info + +>>> info.display() +User name: a +Full name: b +Room number: lol +Work phone number: 123-456-7890 +Personal phone number: 123-456-7890 +>>> info.validate() +'room number is not an integer' +>>> +``` + + +## Exercises + +**TODO:** a longer cleanup exercise where using a class is good + +1. Clean up this code. + +```python +import random + + +def change_words_order(): + global sentence + no_dots_sentence = sentence.replace('.', '') + global words + words = no_dots_sentence.split() + global it_was_empty + if len(words) == 0: + it_was_empty = True + else: + it_was_empty = False + global lowercase_words + lowercase_words = [] + for word in words: + lowercase_words.append(word.lower()) + random.shuffle(lowercase_words) + + # in lowercase_words[0], first character uppercase, rest lowercase + # note that empty_list_or_empty_string[0] doesn't work + # lowercase_words is not empty because len(words) == 0 was handled separately + # lowercase_words[0] is not empty because it came from .split() + lowercase_words[0] = lowercase_words[0][0].upper() + lowercase_words[0][1:] + sentence = ' '.join(lowercase_words) + '.' + + +def main(): + global sentence + print("This program changes the order of the words of a sentence randomly.") + print() + + while True: + sentence = input('Enter a sentence: ') + change_words_order() + if not it_was_empty: + print(sentence) + +if __name__ == '__main__': + main() +``` + +2. Create a program that does something. Use global variables first. Clean up + the program in two ways, with a class and with arguments and return values. + Which cleaned up program is cleaner? + +3. Create a program that does something. Don't use global variables at all. + +4. My username validation code is not very good. For example, it says that + `my @$$` is a valid user name. Write better username validating code + that doesn't allow usernames to contain anything else than digits + `0`, `1`, `2`, ..., `9`, uppercase and lowercase letters `a` to `z`, and + dashes `-`. For example, `my-UserName-123` is valid, but `my @$$` is not. + (Hint: You don't need to write all the letters `ABCDEF...XYZabc...xyz` or + the digits `0123...9` to your code if you `ascii_letters` and `digits` from + [the string module](https://docs.python.org/3/library/string.html). This + is good because you can be sure that you didn't forget to write some letter + or digit, for example, and everyone reading your code can also be sure about + it.) If that's too easy, validate the phone numbers. + +The answers are [here](answers.md#more-classes). + +*** + +If you have trouble with this tutorial please [tell me about +it](../contact-me.md) and I'll make this tutorial better. If you +like this tutorial, please [give it a +star](../README.md#how-can-i-thank-you-for-writing-and-sharing-this-tutorial). + +You may use this tutorial freely at your own risk. See +[LICENSE](../LICENSE). + +[Previous](classes.md) | [Next](docstrings.md) | +[List of contents](../README.md#basics) diff --git a/images/drawings.odg b/images/drawings.odg index e890e1c92e212f22914aa3d1e05e299842701d8e..0a275a21f3207fa0943802df564813fd1149febd 100644 GIT binary patch literal 26925 zcmb@s19)XYn>Ctrtd6ZtI=1bcsAJoYN+qUiGroXx0+?n~mf1W%4z4bhG zYVUpOtzFtx>s_m4#6dt&fPf%@fFP2Jr7}Ti`Y3^bfd0m>M?jXQmWB?lHio)3HWsG( zx(=q+Rvez}dv`R~{%JpuZ90 zt3U-4M@u~`T~iBtT8DpL(%4uThsa2Yz(Hd{e`SFa69ve9rS(8Sz(9~7UspZvgU3KX z-_m6y6oi0*fk7Z(At0e)z(HUj!Jwd_L19q9;V@z0k--tMzat<)BjKRHf+52}q9DTK zAVDF01vE@_Ol(XvWGoCcEG#TYWI{MB5@c**WIPINydSs(#27>jgy`Q%FyRO=kSOp` zsD2<*6JpU3qB4+Rb5ddv5)%F-A*UcErY0w$qNMym!SIuoi-LxZgpP}ro{@r)myVKz zo1U1PiHeDdiJ66+nVpN5otce|jg*0pnuVX5O^}{bn4aqwGruGgK%PTbog($p zo0yxM7@M1$>zg}R+t^vyyV+Zrxm)Rb+vsa&0Qb~zPd`6DpMa2vK%cO% zu)v7;-w`Pxkum;%(n4d?;v)l7BYwxlL}vW)ONoz)jg5_oPmW8@NJ@xJPl`!RNePJ0 z4T;YQPbr8UZFQ|(&7J+NUH$F7Lp_aUT}_p} zZFSx4E&biC!+jmy-QB$d!~H}3{lgrPHE|62&sjJ^%v&z}J0^W@9dm<=9`!RJ6X zf}E^M}Jl5uC8p3>#~>z{x`t z*%B;e;pM7zI4QPY!Z+?$Zs><{XgRYqZDEY)n?KjXq${hJ+y73<#}WQR1XC&raLr+9!#=u zOC!1Dxb1x%l&eynO0v62(I#;Y#}p(k0Fm`Bkw`4`3bP zjO(f9V!@d!8yOuRIa69>B$Yu8)WX3E}by`ruTL?ebsn!lyRnjO$bb{ocub#C3_ zOYy_rt$wb7?T*;k9ahfTbwb%){iE9EBTgY=rZlw$I($Z1Gynd3$5u7)rlZ?!*4@$m zeSZA{>H48td97B}+L0r=m4dO8fzY&B%d8yBFgb5~K!vu!jUxY4JmyJQbzws->@$E{ zz0`GlPTq}$ZMU{@%2Dcgs;(j?>S)V%?$H8Iik;@(jkTI{Mo|9L)pI#Th8J(WT83s> z*qQBky{BY&T|vSV#?}_sJiv-%J370N^*p7B5HntUu@Ue@ok@bUb)k-%Qw#SIY9?g-G#P0AH@z%~Yf#KX^B_5wnSLC_Q zHf({9LSFjml;khg)y$;L<(_lZQp4u8C-oYSyH`jnT&qYS4-?gfnzHTc%{tGvjJF)s zcX!*HFtMX~vgse60JZ$>F-S)u;rp3YALT;F+X|0lW`oRLtquF0Y$;9k6ZDb! z{pnuDp*!^4)-waQ5u(btxMvO|=|~l;tBhO2xj#NJoyrBC#1LfMOhSqx$EZ%!xkf{- z6e<`EeCv1jbCMS8?bge`Z2K@Z(-eA{EBDp$V@Ot%hvs5GSLoz(l*=Rq%~s}@=a;+n z=zp4@7Dp$JwAQ9$H&0aVRg;LQ-VV`a<;m0A1jniyY7~@4CPTc;{ zZm;L9sxSE6$@y{LJ;f@EbzR$icJpXJJ=^%^^(ku$2)t71$BbgnG?-C|n&kp)D?Z=g zpUPHD$ql;wnQW#fJDR2i^aW?FSEoJT{o%sm{$WVBBFd=6X*a zG6UZE=vl&_&-eOZ{twpL|M}|tUo1YOPP~EEkqWv#K5o0eb{rrvAt^wGfR69KVJ=8W z$bW#izyJI*`~$=pI_T24SXxBHibt*fKnZw!M@`^VAM1^R8hQ}bRM3=||1~bUF7(|< zP7Rx?Yxiywebx4443JCZbGc^Uq;V6ZzY0p*qf)GhxC0sBBcrh>hZ}lj`ig1M6Lce3 zk(o)1UbfI?9blJ*S^?drpvr=es%woh8y}xgT!NawKH)$*N2qI_A}M@3Q5}6Ejrd_# zp^xyr7Xi*TZyZ?f7kQc#dfkC>#i=BtEOSr}Vy<5RTaS(Ipnqc^*0N*X1mvkSB`foO z1D5%COTxknj$7O~Tv86QKN4Fd`btAh^SrGA@S^1*_v5&bG$rw>`e^uB>Kugp;&{Et zb+Z0Zt5!2~n<%{pEbYM7`|8ZCrL=w(78g>&Xk5gk?7?iV&CddhF6_{lA8EjKzl z)x$ewtHWbH{%eS_vbpSuS)@;WzK0KR8%+qrXQ^HJ%9BXLRuU*Oq}Px-Wc98cMkR6syw z?=tP>az2{)2_z#90ST0!;5Pyc1Vjf4^mYFi#Q&@Dhy9ue_J$4)rdG!Gf9JrunymZ| z2Z~o`XOHehZ@aw+c~NT*87CNd6-+Q#$qiZxI|( z#}|G}qZOg)q~f-#yg0o(KiyPjz`<0SL%gVN;4%M=B1afqudS1G#WXc_8eF|u1 z`(d}EJLXB+z85(n$^P%px28sCoUr>`(^oU9#c`M&5my!&CU3{f$Ismr><_=a!^r{S zppVTmNo{i17^oH=j=}w8XIgZFnWH*?^-VDEu4bt!IshHSJZK<&$sWLN*_0`;7Ty5#nY^k6SKz0hrBy3s|epJ6)1PPI^Fp-nc%}gK>VaxcFgdI z+5IR<-T^;vT%a)c$rJ^4Rtx^~tUhGfZ~Z&u4*NmsQQ1eq%#~M88e>I6C@DJz6Co~S7~76K{B9#s=P-vOK{%$ntwn5%0hL0Mnwh_>jP%< zqIbmFkql+P5#7FzIP@er3nJf~60neRt+lHbGF#J}4&#Ex1T7jYz<t-Gzr z1|z;*IP^x4ShY;L-uU1oS__1J@xVVN?FbPRK(Uf7v4E6+(_Da@x`DzU<~c`9*A8k# z&(n`U_=1GJ45O!+&*}%t-=P{TQiiR<-n5*U&~9XQ$=cM=T}!}FL)rxD1%#Th1Q_<=DY}}R~!4@ z6jxm!&H22h4Z_(a?vAV38X?7-+!iAb9HAwoU>)%JI(dW&<21+R=tn}fXDWxV8DZ%9 z-rUbZ9_o2J_?Gx7ys}N_8v?CB@(B-n>AeK2-XkCYi|D_UaMewlq}=ae%#_J%`aSF{BVsM~JyT(v}yo@xg-o;}x_tu$>3j1ny`*bhs0 zyIO8K9CVtAQI_QFgjyU%wy)Z~?l?KbDA=H?Qo)<1jyL(-I~1Hqep1z^b;Dxq<3zex zaxM8;y<-5pPB@RpVdK)xIE7pOElFgS>9F?*xuh{$x!Y-!0Wa{NhX2&;;&5QEL%w=c zimv(dgtzRZu|nkAlARJB(O!oo{G?$ukDwE^b-DGxXeDVt{v$Q0qVsfV}ybJ(f72|}b&n<5)e zv*$+(OsBZF3q^N>lI9-POA}4abr)s7ybYF=^p&hRq}q)+ZwI64O-&aFyS}lXW-6{t zf$I`R{q#Qi=6gfF)Hh|lkjmsU$fLj@0!41^&z0Fm;5ySUU?!XQbW%v!Ux&{+{{i-Q zOPLfx#l{2&0>UHy=a%wMUg)22;%|!o6$P!Wj7*Ik?f$_C*)!0ZTIw1b+S3Y{I#}x3 z*wg-J4(LA`WBm(b8*3X!n=cN@@qcLNU~O$-qibbo@!#0}<(&R&W&hgg>Dv7_RyhB{ z%Er#x*v`=2{=c{USM9TR&~gyX?7=HD!wH>X#qn+JfmhEc` z2l=<{|I6UpSNt3P_uc)knr~!bt?OX;-!=bVS^XWK|EKBystJF&J9`IL3&Vc{8tR&M zyG@8*ljJIEzcx(dcr&Wws~d0Rb{a zSpCl83yC9FZ!qSTH%vXU%6b)a23gPH@#q|GYRsuIAnd#rL65$i=0bxSMQ8os_5Q%n zc;4LnxbPE|N1Ih8+@Z*AhW=H*Uw6mHMr$1Cva8IH2_;u!mk=ACz=%2t;J2q_vTrta zBWKJZ#ipo8)-)AjH7laKX)qY}cp6Drj+Y`*g+~?E>Y789?w8q?9QIQHtsa8TS;|1e zp17H0{g5lxLkm2;f6?P^MzBMStf;IMl(a;N#O}z6(Xc1B6=m=5AF*+uho-g`M#U__ zziFY^S7a%)qhkU@`)N`WQTu?633cMIL{rY*RL<*FIhUhx(+!FfLcAs$S+$N3VO~(g z_Qj6}t38}uD!M=b-ghqs)3t{!j?{)$eJK*kFf0nTo%RC|B1*_~d^JlsBXdkmGH@^M zWgqGdLVpEu^Nipj}PNBAV=sOQQ>6H334vL9RfD1;oK~zv6zG=bG z3W~uHD1wM`a2@wh?2;H#DGt2KgUeB$3Xq7AQWh~n5qR=lfl~@EZa$aKZZ-YXxMcU0 zDu)j-Az^*QL&XpxxMA9csi@{8+sk1ek(1pIS%v`lv5um^K!jM)Z&Z%Cw!X82D8F!+ z$tZX#qZ79(F`YEW9)ZBG1WpwMgxEh8ZDm+qlU7u5{`!nhF!PNIk>GIglnvdd+S^?E zU7;%^GbRZfD#F$EwcFs-Xo+#MXfNVZ*-iRG(KS<4%gvb({pY4%o>?-1Lj&svz9_*6 z?}dGe?56p6&1gLk0M;0EsK; z?>M^U-oksv6q@IsMENS%{@0M7wM)N$qr2`7r2>p_CURO4!>@Jx{YGu?3>zJxB*pqq z&87r2FOjkosZ`I@H(uDuw(4@^=!@`dKjg%&lUZaW3NC4e>lz3Q)9`=Cg)U!qjrkWwsmZl3;Zp<&_P@ImWH3Lr7bOKbA zLpCk)I&QW!T>)ZV8Urq4Pojr=)Nf7{UuGg++(88`YVJ1N0p!U=9f!BOWsa&U!)1TZ z2fK(%Oi$;{mc;rym3;Vdb}JI%uz|}c0Bgq$QT(;0F3ycv{ApA=$b4r#ZFU@_ltm-` zlx2>1RlAws{VKL|HB*UdDZ&<{w+nU~&RH<|sW3=99gj{+2d`UoraCivuVN>w+CY}0_;7yg8XO&RDfCqdbk6!?M0xf z2F&8!Q;{OUsvaJVs5?Osh~BRxd?2wXTrdeHzl!iI$2Nt+vWthmrhg_o2~H&jpj=Mn zLuUmCZetdw0G7&vWx3N3Yhu|Mdd2JFbD?0X)DU}`0pDza1FdG2WKAiooCut{i#RwwWhA^~xxFLfzy>6CmIKcJoQ6`LQMN_0py^l^ zIiZ1w!0^H{m$j_?__=9BVv=aI~^YCg#^x zy94o!zdwOjre{|Un;moFxU2Di%On>0)fF^E+wgJpOj!Zpnxn$&)qt~(wUe;oybH5Z zaT~GTdG)%h)Ok;rsUYnZK|~Xg8#A5T{Hi{=8Kw#3Ks<}_oqco5Iwn4NWKuFO*m9xA zJ)GD`wCqG$Zqq}-ap1~W!E43Pd~g^de6P#}SzsE8x|`U*zf4cAI=4)hlpx_nm5epZ zK%U@8ELRz>6Xz9gJVi|CJ@(`7J*0mp*ra+wlrZ!AAVqF=JqNtr6s!D z`oX?TVUboC{@?|EZMSf*Sv(Hmc+T=UY?NYt(`dd2lqQl~8H=|pVN91}=Ir!tqoT+e^hix!-8zUVJ11(osOtBI| zu2oX+70bRmb~f9+pzdZ|fc5-{jvkC3j~8`1Jf_i>uS`wmMKswP0{va%4y9RqyXKH=Hh!{yLMk&8!yR zcVrLwEky3!>OmsZ{TlFjJ6PZ{)p&=2GzgY2V8oxO;lz?oNh49;H|!EoAcBP6=c|E8 zP3UYP;2U65n_xmV1&TBm+Th%JE^w`sC5J?d9Zam8X$O2|+5GWK&ob5@B_ig>!-^p8 z(mMoQB+!e_j3Wq?^0!3TPBelc!VjPy&*`$}1_%evlMWOV_i37(E}HGN4)eFVmemjQ zce%-WFD_L!KJfoy_7x-=R)a5bHJAOr;y@L>sLm#GAfUgI`7cT|)pv0GLa?;-bYFpi z?jH#qJwNN;TRJ*n0E-aQmugARB+L(BVqh0y_}98DaN$>3?~q?^0uV+-Q~Or}Wh1I; z4+Ql6i<11_1)LqKRt5w_ZuSoiEbV+9Mg?Vm2mH#}C=pDFUx@$O*Y^jsnTw#HkPs7c zn*r(V(!Pq*2v@vQEyJxtOJ;6C{HK+fYcZ3wsgWv)T1ev`(0&+-9WWt5p=Ro;D#lMu zDYP>hR?Vg5^~Xo9TP_X|#!Vp3OOH*DO;$721YNu99idG)Y?km=k7qk^1VlvUngnWf zEj(7MHE?b1%`mgs(96zGuem(2*oD3Qedb!{?cm@cNACMM`P;=ZRYoz(5_jEG47y*DH{7$s=?>y@Fs|0q$H4G}SVhc4}_O12nM|9$qFAA-(Kv`8JF zh^_M9cl(lWn_TJAmxTBY> z@w!O)&Ib4%x(&F4fHLk(^HUX%{X@&%Yg;re#<6FB1Nij|T25X*Vw69vNdb2F>_gDP zo^<2$#Psd}wMp%5ddiWaKfyR~ySd!0_TJ1P{R2~J10QsnX1@hEfB4Dac_R=$e1PLS zGZGYf18sk+HWA@{mu(s?6~t)|Yvk8UTWbV)b=@QD`w+5j%z~^mL8jK)&Gt$J-?s~< zc4hSG1Lbd6pS+Y=Tsn0*VM%kKk?dxo2p31@h3;BWE4^*EFuRnw;hQw&X^qN%CUW(kd=$*`~4;)p9Lp)FKshAl0r z+#OAW6BDvlz}+-zdu(cH|>l0~Wj#z6LB+iwygeEi%8U38PfG zvO?wU?F|7LSsqb=+x@{IJWGyMsP&3J_-Gcp-R)jDGuX=HFyA+>9$LPUF0BHhcbGh$ zfcBJaCMvV1Ic;=k@mLpOZEJfQiZ*k>WOow{_Zw&TW>}|}Tt-?NPMKFLtae8b;BO0RnCFZCC#UpOMF{}6LmWQg@n4j3NlqPkTy;rl?plp!bECuI?)>aei` zdkz%3xE<)djmW0&5n?DzL~ZXKI-_+QNG7MJ4+Uv@&lLp56 z#ZHiHt$K2V6>#y-Lwk})_Im2)PUYs()|mm@xza<^WC{*!`z>`kb2bp2bziToWCRCa zowFeL{TdyM3Ku_i|Kl~xg(Adsj^UHaVNz-uh`zm8T&$UTB(!OT!6q72VoXHvxJ1hq zqrVX=<QURWKIm@_!nVk&*Gq$;GsX=_;d&Lzj2YT)h_0m2DYEz&v$ZfJ5Xz!5(Q z4LD~3onMz5VY-z!C-8g!xTeR`pLC6spdg5s`%`6EdxrTeE^h8~O`;dv-r?yGuVC*J z`nRVp?4@|hc{(8Fz`Rj@;hTlf{V?L&DFzRekB6b&q@~3uZ^%6c4ADrRMIzFy?@7PC zJ1--_?9p|4r{Ay&sbBmw0!JZO^|tTQMLk@24kV953OrbZq(Xi6Tri}hdVZ39pRB|Q z?j-UEnOyV^%ap76W4#qm?5kL+wA_lp%;9u~K_Z>u(fg|VgB?Do1x0qfxP66yYosoG zfM^!llO~dwSZCL`^lE?O)<|p2npK?J%#@2*LObAX}8A+QWsH$H9G9LsU`* zmK)wy>WW&)%(`jD=7}=s_*F_DpPd&hsR${$pz_)G@`gz1FaYlw&OBHN?yzF7Sc0sa zhF-Yu$w40@Y1eu$6NFIlvKv%l4Q&=|x_M@Hj#>9qUa_fGvqx=JtW1&@WMRG!WU*bS zTb{L46@w!(J0*CGxh@-fOAMgR;dSuO;CfgqXu@cV@y|9cXM+Ijl z`|FKbSW?m-`?!M*`LsH#BA>#qTGJRTMYL{#K?F=i)M{?#+4NpOM4mh}X`=lP_oGz? z`jJ9FeDlEF{P)GDMF&|;e^ELQPIa>NZ$kTwUWY-H-&Po`Hamla5GrcH3h7^s|6uACb+H(@(u_G=m(A*d4R9kddQA4S)me6(CVx|xq*Vi z7Uy&JjoZu%yY+f!BZu)Nq6yA<-5#6p-8u_OXg?}jno4jFcX+9R8By$Y)^kG}@1CPJwqP88O99>{+ z?`#*T0nm=bX#2qDh}&K!Z^W$eXl`4s%Me0UhO(;=q+bZvre9|)$Xn3SOK11id>)z!^uaMi{;!i9IavMxMV0}WKv z@=nq~rv9BcufDZkBNg+4ZBaGkhW^z;1^oj};Oy7;gv}3f*+6ilt9GWDfW3Es96l61 z(7ypjkR$wWK=gkC8^3Vt|7rFUvCeaLSa&0sU;8De^Xmor_o1(dWGjUlfC>M9f>?;3 zyCZ>^!S1f;cSh<=vi8--<<%xMOZhqg1Hu0ceX(T78@L!@CoP$+f6M2d-c45BeEg`o z1VU8(cPu;~yZW27>Lo1bN3tU^`kLodf+GK4G=VrDn{_Y5C!+0+?l)BYh4TIbT(*+~ z-^*Ny+5;K1d5HPGZzZ{nK81?t*^=uiFXB!&hj5r9VkJ!RfI9+sFvKNtwtjMi7Tn}n z-#YA;9W(HTC9U!K-{7d-&WcXi@6G+eb7_B7rUB2qJjF0bX%e{9a6N5&tI*D?D%wFoH(MVbJ{+8$KX@a#xm5>2LaS(plcKiyCQDfUo)Gn;T~tTPmmQq`R2D?LNKK zJmV=G-E5IQ?R6u3=d_`RCAFh?i8ZHpUhz1ai2tE(5l?VDv2_SM~fLI>Qftu2Ak?prF!xW_U&rorzqzg*M@7?%A!hcx1|2g zlI`EnQmAVdYz6 zicSfDMsR_(Qhz!NvJGbzC)A>k!9Z`EQd0|^IO8}*G zE`zY}dP6Mu{H+^(Fcj2`8a7;Xe{K5RiK9sqPSxpyTAgH-A4qBYYZn&WS4@k7J(JOS zHa2j-z=jBzQ2uy4vU-b41559Zmlj^$K40=QMY_1E^}3gT4$$5D0YWu#awB^t)@ecy zxtQ?bO!Ey;$p?!=kFl->HIQjYh~#8IxVh6+pDs=xqwL|&{k#w>W@GO2Clw-Bnol0Z zIRA&OGY8G-sk_}bweQ$L1lE^*B((?Z$G-?!KIQy<1XESsCvv!c;TGIuGD1V?E-T!jJ@hjK_|B(ufrEASiuhfL=b>lP%!KECr7-dkIClq31+1N?M z+N_-;^5@_vFz@N4;M%K1e;ZH2>8HzbmSva~{~dN9`(>wZHSprdA;G31> z6>e1I@SH4{!XJNBT-1pq2_A^f1bq6l0d-htLBI>Q;Tpe31LSRO=|@J!E(3}=Ha0dM zXav@wBoUe4Rm0)S-W+;y36MVnw=?s0%x}ZW6~bZAZz2+Rl}1`Q(c9>3R%V0Yi*Q)5 zKsUVL^_1U2E5}w3&Daum_A>t{=;V_Sz342JDN};U_xnsUozb-2cz}Pr+_4T7EAuqx zE-tAfKJ7E472Q<*66n6TtY)-kvto8%PSB{rhH{6d@{_j+ioR~&mJP}ssR{S>^?gB^ zBWP}J?w+k}X^=hKW!QE&nj#oWWrc@;$E$Oe#R+U}<#f7OGriQCOU{buD;M;nHrKyc zpK1@o(!Qjx>=q-Vm{a6hlvQJcTJgeQE{or9HfbT`0$9Qpwq%I2N9NHSTh#qq?5quDNQQ=n@X49nkn);T(eiomltwff9pxp>XCpJiCSy z*u4z2kirB-IH-00IO*#|cyL5Sxd=I~^5ez&_1&!WPcE*t4Ixt-8bm2l>5RTQ(^(2L z$-OoO+!n&T;`k)`g(8oX(g<{+_Wl4Rh9vkM*}zbHQ@wW$wYfu$J&&}pHiLXI>45Kk zxriF;sC*VtN7)1}k6XHPr=$jN9qI%3{XwR!S*0;j{h}Lh$TVN9HGWioxZ!I26%6#a zG+^q7#a%gMM+U!@)P#e*WlKW2Ml+I+kIw^*l%HLQjar8XyWcQa@W%LbSqjCUmGPHM zH;@O@FXxL9J3Y(+5uHZu7=flK*WRQM3!FX7WR)0HYe!cF(@OyaxLj{Q|BBPSs`=NZ z4Q4+1=I$WOuI=HaeB-DqXY`eLv`{nHBV^zDOoo1HiEc|ma)s&V%VOu5W*qoF(ze6h zk*qtq50;;rrzYbsvX~L!LqhbNt{gMpP-8V}PcuA>(i_tdw1MAka+8A4TCy1Er(x9E z3g`X=iTS#>4fajD7vBfAqHP_Gzr{G9O@mq*;OLbc^NW4%LN78ULXtZD{*g$GEn`)$ zIRTfVhIb5!<=mvX*vkfghsTM9yXYMr8&7Fz$Nv5E&+pmTOTjD~FixZxS&IxwJx18b zsKBThyl)iYlp3=dglWMV30Z-u^9U4y6?q53lFdy+3|uFo>&$riEuMM{*#g4P)6`3L zJ6dn+#t=v`)DRM3<$(kjMwO?WWbCMc$kB|*ZBt{TDsas@4O%o^&u8EC*`5?u<*V;J zSf~c17vq~OekK=XGYlo%6=#+u&g%!)PU9dw=sB73v? z#g^m@A0R-a-ml0v9>uHI8YvKRcigfLNOcn=^u6&s@1{?wi}Wnlnh*=6(!T)b*}#5p zvFGc<)9U7j(WM?6IdBe{!dkMrgS*vGv-gp-05WJ$T~JbzDN9JHe<^22Z^au~pNiBf z(2-Za^D2!>x?;{m&;y=-b+5Ya=}Q{LYxIQG0IM-|2bPtlh`xj9yLGU{?seKVV_Hm1 zj}4(2#ARoXat~m;?XHJdMkOSxG6Y4|)^!>gru3_R4u+H)+8n^qQIEp& z+q(U1Z6}%@ud5M&*bvf}NZf!2?aIF7l>%0DrY3SLB95w9y!S713{Dh4sXa>t@r>qt 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 F{{f9}eG32p literal 26831 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 TS{Veo3;gf_fvTYvw@3dESg>)z diff --git a/images/stuff-global-and-local.png b/images/stuff-global-and-local.png new file mode 100644 index 0000000000000000000000000000000000000000..1623d6b7957b0104810f0b257dbf22e42fe015e7 GIT binary patch literal 9493 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 literal 0 HcmV?d00001 From b3c2073d3c0a95687fed168e557ade6a766c4e0c Mon Sep 17 00:00:00 2001 From: Akuli Date: Sat, 11 May 2019 13:39:29 +0300 Subject: [PATCH 2/2] fixing stuff --- basics/answers.md | 8 +++++--- basics/more-classes.md | 16 ++++++++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/basics/answers.md b/basics/answers.md index 25c7a5a..2b6f9f3 100644 --- a/basics/answers.md +++ b/basics/answers.md @@ -436,9 +436,11 @@ isn't exactly like mine but it works just fine it's ok, and you can ## More Classes -1. Delete all global variables, and use arguments and return values. We also - need to handle the `len(words) == 0` case differently, and returning `None` - makes sense now. +1. Delete the `global` everywhere, and add arguments and return values until + the code works. + + We also need to handle the `len(words) == 0` case differently, and returning + `None` makes sense now. ```python import random diff --git a/basics/more-classes.md b/basics/more-classes.md index 71c5253..e4a8786 100644 --- a/basics/more-classes.md +++ b/basics/more-classes.md @@ -14,10 +14,10 @@ for a reason. Let's look at this: ```python >>> stuff = 1 ->>> def set_stuff(): +>>> def thingy(): ... stuff = 2 ... ->>> set_stuff() +>>> thingy() >>> stuff # this did NOT change to 2 1 >>> @@ -25,8 +25,8 @@ for a reason. Let's look at this: The problem is that `stuff` is a [local variable](defining-functions.md#locals-and-globals) inside the -`set_stuff` function. There are actually two variables called `stuff`; the -local `stuff` in `set_stuff`, and the global `stuff`: +`thingy` function. There are actually two variables called `stuff`; the +local `stuff` in `thingy`, and the global `stuff`: ![Global scope: stuff = 1. Local scope inside global scope: stuff = 2.](../images/stuff-global-and-local.png) @@ -35,7 +35,7 @@ Of course, this is bad style because it's very confusing. To fix this, you see below): ```python -def set_stuff(): +def thingy(): global stuff stuff = 2 ``` @@ -233,9 +233,9 @@ def validate_user_info(): try: if int(room_number) <= 0: # room_number is '0', or negative (e.g. '-2') - return "room number is negative" + return "room number must be positive" except ValueError: - # int() failed, room_number is e.g. 'lol' + # int(room_number) failed, room_number is e.g. 'lol' return "room number is not an integer" if ' ' in user_name: @@ -419,7 +419,7 @@ you can import it and try out all the things as usual, and figure out what's wrong: ```python ->>> import userinfo +>>> import userinfo # save the program to userinfo.py >>> info = userinfo.UserInfo('a', 'b', 'lol', '123-456-7890', '123-456-7890') >>> info pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy