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 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%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