diff --git a/README.md b/README.md deleted file mode 100644 index 8d9dd6a..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# QuickPythonBook -What I practice from the exercises in study items which are marked with the keywords "TRY THIS", "QUICK CHECK" and "LAB". diff --git a/__pycache__/# Chapter 4 Try this 1cpython-312.pyc b/__pycache__/# Chapter 4 Try this 1cpython-312.pyc new file mode 100644 index 0000000..e1e7d84 Binary files /dev/null and b/__pycache__/# Chapter 4 Try this 1cpython-312.pyc differ diff --git a/__pycache__/text_processor.cpython-312.pyc b/__pycache__/text_processor.cpython-312.pyc new file mode 100644 index 0000000..d3fbc8a Binary files /dev/null and b/__pycache__/text_processor.cpython-312.pyc differ diff --git a/ch10-lab10.py b/ch10-lab10.py new file mode 100644 index 0000000..ca07f19 --- /dev/null +++ b/ch10-lab10.py @@ -0,0 +1,35 @@ +'''Lab 10: Create a module +Package the functions created at the end of chapter 9 as a standalone module. Although +you can include code to run the module as the main program, the goal should be for the +functions to be completely usable from another script.''' + +#importing everything from the module +import text_processor + +#What was done in lab 6 +with open("moby_01.txt") as infile, open("moby_01_clean.txt", "w") as outfile: + cleaned_words = text_processor.cleaner(infile) + outfile.write(cleaned_words) + +# see the outfile +with open('moby_01_clean.txt','r') as outfile: + for each in outfile: + print(each, end = "") + + +#What was done in lab 7 +with open("moby_01_clean.txt") as infile: + word_count = text_processor.w_counter(infile) +most_common = text_processor.most_finder(word_count) +least_common = text_processor.least_finder(word_count) + + +print('''In the first chapter of Moby Dick\nThe most common words are + {0} with {1} to {2} times of occorance.\n + The least common words are {3} with only {4} times of occurance. + '''.format(most_common, text_processor.maxi - 7 , text_processor.maxi , least_common, text_processor.mini )) + + + + + diff --git a/ch10-quickcheck1.py b/ch10-quickcheck1.py new file mode 100644 index 0000000..efc1ac2 --- /dev/null +++ b/ch10-quickcheck1.py @@ -0,0 +1,34 @@ +''' +Quick Check: Modules +Suppose that you have a module called new_math that contains a function called +new_divide. What are the ways that you might import and then use that function? +What are the pros and cons of each method? +Suppose that the new_math module contains a function call _helper_math(). How +will the underscore character affect the way that _helper_math() is imported? +''' +# first +import new_math +new_math.new_divide() +'''prepending the module name is mandatory. +But the code is more readable and function names are safer to use +and do not clash with other modules.''' + +#second +from new_math import new_divide +new_divide() +'''imports a specific function, less keystrocks are needed for typing. +do not bring upon other methods. function names might interfere with other names.''' + +#third +from new_math import * +''' brings all the opjects inside the module. +this is risky as it does not indicated which functions blong to which module. +it faster in typing but more difficult for debugging.''' + +import new_math +new_math._helper_math() +#or +from new_math import _helper_math +_helper_math() + +''' _helper_math can be accessed using one of these two ways. but not the *.''' \ No newline at end of file diff --git a/ch10-quickcheck2.py b/ch10-quickcheck2.py new file mode 100644 index 0000000..164c931 --- /dev/null +++ b/ch10-quickcheck2.py @@ -0,0 +1,9 @@ +'''Quick Check: Namespaces and scope +Consider a variable width that’s in the module make_window.py. In which of the +following contexts is width in scope?: +(A) within the module itself +(B) inside the resize() function in the module +(C) within the script that imported the make_window.py module''' + +#width is in scope of A the module itself and B the function is the module that uses it. +#but not is the scope of the code that imported the module. \ No newline at end of file diff --git a/ch12-lab12.py b/ch12-lab12.py new file mode 100644 index 0000000..a7347e1 --- /dev/null +++ b/ch12-lab12.py @@ -0,0 +1,36 @@ +''' +Lab 12: More file operations +How might you calculate the total size of all files ending with .txt that aren’t symlinks in +a directory? If your first answer was using os.path, also try it with pathlib, and vice versa. +Write some code that builds off your solution to move the same .txt files in the lab +question to a new subdirectory called backup in the same directory. +''' +import os +cur_path = os.path.abspath('.') +size = 0 +for text_path in os.listdir(cur_path): + if text_path.endswith('.txt') and not os.path.islink(os.path.join(cur_path, text_path)): + size += os.path.getsize(os.path.join(cur_path, text_path)) + backup_dir = os.path.join(cur_path, 'backup') + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + backup_path = os.path.join(backup_dir, text_path) + os.rename(os.path.join(cur_path, text_path), backup_path) +print(size) + + +import pathlib +cur_path = pathlib.Path(".") +size = 0 +moved_files = [] +for text_path in cur_path.glob("*.txt"): + if not text_path.is_symlink(): + size += text_path.stat().st_size + backup_dir = cur_path / "backup" + if not backup_dir.exists(): + backup_dir.mkdir() + backup_path = backup_dir / text_path.name + text_path.replace(backup_path) + moved_files.append(text_path.name) +print(size) +print(moved_files) \ No newline at end of file diff --git a/ch12-quickcheck1.py b/ch12-quickcheck1.py new file mode 100644 index 0000000..06994fc --- /dev/null +++ b/ch12-quickcheck1.py @@ -0,0 +1,20 @@ +''' +Quick Check: Manipulating paths +How would you use the os module’s functions to take a path to a file called test.log +and create a new file path in the same directory for a file called test.log.old? How +would you do the same thing using the pathlib module? +What path would you get if you created a pathlib Path object from os .pardir? Try it +and find out. +''' +import os +old_path = os.path.abspath('test.log') +print(old_path) +new_path = '{}.{}'.format(old_path, "old") +print(new_path) + +import pathlib +path = pathlib.Path('test.log') +abs_path = path.resolve() +print(abs_path) +new_path = str(abs_path) + ".old" +print(new_path) \ No newline at end of file diff --git a/ch13-lab13.py b/ch13-lab13.py new file mode 100644 index 0000000..f0a1424 --- /dev/null +++ b/ch13-lab13.py @@ -0,0 +1,69 @@ +'''Lab 13: Final fixes to wc +If you look at the man page for the wc utility, you see two command­line options that do +very similar things. ­c makes the utility count the bytes in the file, and ­m makes it +count characters (which in the case of some Unicode characters can be two or more +bytes long). In addition, if a file is given, it should read from and process that file, but if +no file is given, it should read from and process stdin. +Rewrite your version of the wc utility to implement both the distinction between bytes +and characters and the ability to read from files and standard input.''' + +import sys + +def wc(filename = None ): + if filename == None: + content = sys.stdin.read() + else: + with open(filename, 'r') as file: + content = file.read() + + lines = content.splitlines() + line_count = len(lines) + word_count = sum(len(line.split()) for line in lines) + char_count = len(content) + + return line_count, word_count, char_count + +if __name__ == "__main__": + filename = input('Enter your text file name example.txt: ') + lines, words, chars = wc(filename) + print(f"Lines: {lines}, Words: {words}, Characters: {chars}") + + + + + +'''The `if __name__ == "__main__":` line is a special construct in Python that allows you to execute code only when the script is run directly (i.e., not when it's imported as a module by another script). + +When you run a Python script, Python assigns a special variable `__name__` to the script. The value of `__name__` is the name of the script, including the file extension. + +When you run a script directly, `__name__` is set to `"__main__"`. When you import a script as a module, `__name__` is set to the name of the module. + +So, when you write `if __name__ == "__main__":`, you're checking if the current script is being run directly (i.e., `__name__ == "__main__"`). If it is, then the code inside the `if` block is executed. + +In other words, this construct allows you to write code that can be executed both when the script is run directly and when it's imported as a module by another script. It's often used to define "main" entry points for scripts, or to provide functionality that can be used by other scripts. + +Here's an example: + +``` +# my_script.py +print("Hello, world!") + +if __name__ == "__main__": + print("This is the main entry point!") +``` + +If you run `my_script.py` directly, it will print: + +``` +Hello, world! +This is the main entry point! +``` + +But if you import `my_script` as a module in another script, it will only print: + +``` +Hello, world! +``` + +Because the code inside the `if __name__ == "__main__":` block is only executed when the script is run directly. +''' \ No newline at end of file diff --git a/ch13-quickcheck1.py b/ch13-quickcheck1.py new file mode 100644 index 0000000..7a4bde1 --- /dev/null +++ b/ch13-quickcheck1.py @@ -0,0 +1,17 @@ +''' +Quick Check +What is the significance of adding a "b" to the file open mode string, as in +open("file", "wb")?''' +# it wirtes to the file in byte mode. + +''' +Suppose that you want to open a file named myfile.txt and write additional data on +the end of it. What command would you use to open myfile.txt? What command +would you use to reopen the file to read from the beginning?''' +with open('myfile', 'a') as mine: + mine.write('this is the added content') + +with open('myfile') as mine: + for line in mine.readline(): + pass + diff --git a/ch13-quickcheck2.py b/ch13-quickcheck2.py new file mode 100644 index 0000000..0d80c9f --- /dev/null +++ b/ch13-quickcheck2.py @@ -0,0 +1,7 @@ +'''Quick Check: struct +What use cases can you think of in which the struct module would be useful for either +reading or writing binary data?''' + +# it is useful for networking, sending and receiving data over sockets. +# also it is good for cryptography, handling data for encryption/decryption. +# reading and saving sensors' data in robotics. \ No newline at end of file diff --git a/ch13-quickcheck3.py b/ch13-quickcheck3.py new file mode 100644 index 0000000..a7fb6cf --- /dev/null +++ b/ch13-quickcheck3.py @@ -0,0 +1,13 @@ +'''Quick Check: Pickles +Think about why a pickle would or would not be a good solution in the following use +cases: +1- Saving some state variables from one run to the next +2- Keeping a higg-score list for a game +3- Storing usernames and passwords +4- Storing a large dictionary of English terms +''' + +# 1- it is doable but time-consuming and memory-guzzling. +# 2- it is a good use but still can be accessed by malicious actors and changed. +# 3- it is not secure to store credentials this way. +# 4- it does not make sense to dump and load the dictionary each time we want to look up a term. \ No newline at end of file diff --git a/ch13-quickcheck4.py b/ch13-quickcheck4.py new file mode 100644 index 0000000..b8079e0 --- /dev/null +++ b/ch13-quickcheck4.py @@ -0,0 +1,8 @@ +'''Quick Check: Shelve +Using a shelf object looks very much like using a dictionary. In what ways is using a +shelf object different? What disadvantages would you expect in using a shelf object? +''' + +# keys can only be in string form. +# shelf objects are stores in disk. +# therefore it goes more slower, but more permanent. \ No newline at end of file diff --git a/ch13-trythis1.py b/ch13-trythis1.py new file mode 100644 index 0000000..ada6c3e --- /dev/null +++ b/ch13-trythis1.py @@ -0,0 +1,12 @@ +'''Try this: Redirecting input and outputWrite some code to use the mio.py module in listing 13.1 to capture all the print output +of a script to a file named myfile.txt, reset the standard output to the screen, and print +that file to screen.''' +import mio + +mio.capture_output("myfile.txt") +print("whatever you want to write.") +print(13/3) +print('these go to the file not the standard screen') +mio.restore_output() +print('this shows on the screen') +mio.print_file("myfile.txt") \ No newline at end of file diff --git a/ch14-lab14.py b/ch14-lab14.py new file mode 100644 index 0000000..38a1a23 --- /dev/null +++ b/ch14-lab14.py @@ -0,0 +1,110 @@ +'''Lab 14: Custom exceptions +Think about the module you wrote in chapter 9 to count word frequencies. What errors +might reasonably occur in those functions? Refactor those functions to handle those +exception conditions appropriately.''' + +class FileProcessingError(Exception): + """Custom exception for file processing errors.""" + pass + +class WordCountError(Exception): + """Custom exception for word counting errors.""" + pass + + +def remove_punc(string): + """Remove punctuation from a string.""" + try: + table = string.maketrans('.,?;:!"-_][)(\'',' '*14) + return string.translate(table) + except Exception as e: + raise FileProcessingError(f"Error removing punctuation: {e}") + + +def w_counter(text): + """Count the frequency of words in a text.""" + try: + counted = {} + for word in text: + counted[word] = counted.get(word, 0) + 1 + return counted + except Exception as e: + raise WordCountError(f"Error counting words: {e}") + + +def cleaner(text): + """Clean the text by converting to lowercase and removing punctuation.""" + try: + words_list = [] + for line in text: + lower_case = line.lower() + sans_punct = remove_punc(lower_case) + line_list = sans_punct.split() + words_list = words_list + line_list + return '\n'.join(words_list) + except Exception as e: + raise FileProcessingError(f"Error cleaning text: {e}") + + +def most_finder(counted_dict): + """Find the most common words in the counted dictionary.""" + try: + global maxi + maxi = max(list(counted_dict.values())) + most = [] + for key in list(counted_dict.keys()): + if counted_dict[key] >= maxi - 7: + most.append(key.strip("\n")) + return most + except Exception as e: + raise WordCountError(f"Error finding most common words: {e}") + + +def least_finder(counted_dict): + """Find the least common words in the counted dictionary.""" + try: + global mini + mini = min(list(counted_dict.values())) + least = [] + for key in list(counted_dict.keys()): + if counted_dict[key] == mini: + least.append(key.strip("\n")) + return least + except Exception as e: + raise WordCountError(f"Error finding least common words: {e}") + + +#lab6 refactored +try: + with open("moby_01.txt") as infile, open("moby_01_clean.txt", "w") as outfile: + cleaned_words = cleaner(infile) + outfile.write(cleaned_words) +except FileProcessingError as e: + print(e) + +# see the outfile +try: + with open('moby_01_clean.txt','r') as outfile: + for each in outfile: + print(each, end = "") +except FileProcessingError as e: + print(e) + + +#lab7 refactored +try: + with open("moby_01_clean.txt") as infile: + word_count = w_counter(infile) + most_common = most_finder(word_count) + least_common = least_finder(word_count) +except (FileProcessingError, WordCountError) as e: + print(e) + + +print('''In the first chapter of Moby Dick\nThe most common words are + {0} with {1} to {2} times of occorance.\n + The least common words are {3} with only {4} times of occurance.'''.format( + most_common, maxi - 7 , maxi , least_common, mini )) + + + diff --git a/ch14-quickcheck1.py b/ch14-quickcheck1.py new file mode 100644 index 0000000..b1890ea --- /dev/null +++ b/ch14-quickcheck1.py @@ -0,0 +1,6 @@ +'''Quick Check: Exceptions as classes +If MyError inherits from Exception, what is the difference between except +Exception as e and except MyError as e?''' + +# The first catches any exception that inherits from Exception (most of them), +# whereas the second catches only MyError exceptions. \ No newline at end of file diff --git a/ch14-quickcheck2.py b/ch14-quickcheck2.py new file mode 100644 index 0000000..bd740b1 --- /dev/null +++ b/ch14-quickcheck2.py @@ -0,0 +1,13 @@ +'''Quick Check: Exceptions +Do Python exceptions force a program to halt? +Suppose that you want accessing a dictionary x to always return None if a key doesn’t +exist in the dictionary (that is, if a KeyError exception is raised). What code would you +use? +''' +# not if the exception is safely handled and else and finally clause used. + +def check_dict(dict,akey): + try: + val = dict[akey] + except KeyError as e: + val = None diff --git a/ch14-quickcheck3.py b/ch14-quickcheck3.py new file mode 100644 index 0000000..2575658 --- /dev/null +++ b/ch14-quickcheck3.py @@ -0,0 +1,15 @@ +'''Quick Check: Context managers +Assume that you’re using a context manager in a script that reads and/or writes several +files. Which of the following approaches do you think would be best? + +A) Put the entire script in a block managed by a with statement. +B) Use one with statement for all file reads and another for all file writes. +C) Use a with statement each time you read a file or write a file (for each line, for example). +D) Use a with statement for each file that you read or write.''' + +# The best approach would be D) Use a with statement for each file that you read or write. +# Using a with statement for each file ensures that each file is properly opened and closed, +# which is crucial for resource management. +# This approach helps prevent resource leaks +# and ensures that files are closed as soon as their operations are complete, +# even if an error occurs during the process \ No newline at end of file diff --git a/ch14-trythis1.py b/ch14-trythis1.py new file mode 100644 index 0000000..a1ba480 --- /dev/null +++ b/ch14-trythis1.py @@ -0,0 +1,16 @@ +''' +Try this: Catching exceptions +Write code that gets two numbers from the user and divides the first number by the +second. Check for and catch the exception that occurs if the second number is zero +(ZeroDivisionError)''' + +x = int(input('Enter the numerator : ')) +y = int(input('Enter the denominator: ')) +# x,y = 5,0 +try: + z = x / y +except ZeroDivisionError as er: + print(er, '"The denominator cannot be zero."') + y = input('Enter another denominator: ') + +print('The quotient: ', z) \ No newline at end of file diff --git a/ch14-trythis2.py b/ch14-trythis2.py new file mode 100644 index 0000000..7836298 --- /dev/null +++ b/ch14-trythis2.py @@ -0,0 +1,12 @@ +'''Try this: The assert statement +Write a simple program that gets a number from the user and then uses the assert +statement to raise an exception if the number is zero. Test to make sure that the +assert statement fires; then turn it off, +using one of the methods mentioned in this section.''' + +x = int(input('Enter a number: ')) + +print(__debug__) + +assert x != 0, 'the number is zero' +print('entered:', x) \ No newline at end of file diff --git a/ch14-trythis3.py b/ch14-trythis3.py new file mode 100644 index 0000000..b0c9952 --- /dev/null +++ b/ch14-trythis3.py @@ -0,0 +1,12 @@ +''' +Try this: Exceptions +What code would you use to create a custom ValueTooLarge exception and raise that +exception if the variable x is over 1000?''' + +class ValueTooLarge(Exception): + pass + + +def check_value_size(val): + if val > 1000: + raise ValueTooLarge('Value must be less than a thousand.') diff --git a/ch15-lab15.py b/ch15-lab15.py new file mode 100644 index 0000000..3baa915 --- /dev/null +++ b/ch15-lab15.py @@ -0,0 +1,67 @@ +'''Lab 15: HTML classes +In this lab, you create classes to represent an HTML document. +To keep things simple, assume that each element can contain only text and one subelement. +So the element contains only a element, and the element contains (optional) +text and a

element that contains only text. +The key feature to implement is the __str__() method, +which in turn calls its subelement’s __str__() method, +so that the entire document is returned when the str() function is called on an element. +You can assume that any text comes before the subelement. +Here’s example output from using the classes: +para = p(text="this is some body text") +doc_body = body(text="This is the body", subelement=para) +doc = html(subelement=doc_body) +print(doc) + + +This is the body +

+this is some body text +

+ + +''' + +class element: + def __init__(self, text=None, subelement=None): + '''default value None takes care of nonexicting arguments.''' + self.subelement = subelement + self.text = text + + def __str__(self): + '''__str__ is a dunder method or magic method which is also recursive in this case. + It replaces the regular str method to teach python a special behavior for this program ''' + value = "<{}>\n".format(self.__class__.__name__) #places the class name inside opening element notation <>. + if self.text: + value += "{}\n".format(self.text) + if self.subelement: + value += str(self.subelement) + value += "\n".format(self.__class__.__name__) #places the class name inside closing element notation . + return value + +class html(element): + '''html class inherits instantiation and str method from parent class element.''' + def __init__ (self, text=None, subelement=None): + super().__init__(text, subelement) + def __str__(self): + return super().__str__() + +class body(element): + '''body class inherits instantiation and str method from parent class element.''' + def __init__ (self, text=None, subelement=None): + return super().__init__(text, subelement) + def __str__(self): + return super().__str__() + +class p(element): + '''p class inherits instantiation and str method from parent class element.''' + def __init__(self, text=None, subelement=None): + super().__init__(text, subelement) + def __str__(self): + return super().__str__() + +#testing +para = p(text="this is some body text") +doc_body = body(text="This is the body", subelement=para) +doc = html(subelement=doc_body) +print(doc) \ No newline at end of file diff --git a/ch15-trythis,all.py b/ch15-trythis,all.py new file mode 100644 index 0000000..84a4287 --- /dev/null +++ b/ch15-trythis,all.py @@ -0,0 +1,138 @@ +'''Try this-1: Instance Variables +What code would you use to create a Rectangle class?''' +'''Try this-2: Instance variables and Methods +Update the code for a Rectangle class so that you can set the dimensions when an +instance is created, just as for the Circle class above. Also, add an area() method.''' +'''Try this-3: Class methods +Write a class method similar to total_area() that returns the total circumference of +all circles.''' +'''Try this-4: Inheritance +Rewrite the code for a Rectangle class to inherit from Shape. Because squares and +rectangles are related, would it make sense to inherit one from the other? If so, which +would be the base class, and which would inherit? +How would you write the code to add an area() method for the Square class? Should +the area method be moved into the base Shape class and inherited by circle, square, +and rectangle? If so, what issues would result?''' +'''Try this-5: Private instance variables +Modify the Rectangle class’s code to make the dimension variables private. What +restriction will this modification impose on using the class?''' +'''Try this-6: Properties +Update the dimensions of the Rectangle class to be properties with getters and +setters that don’t allow negative sizes.''' + + +class Shape: + """ parent class defining any shape with coordinates and moving function""" + def __init__(self, x, y): + """defining x and y coordinates for any shape""" + self.x = x + self.y = y + def move(self, delta_x, delta_y): + """defining movement as change of coordinates""" + self.x = self.x + delta_x + self.y = self.y + delta_y + +class Circle(Shape): + """Circle class inheriting from Shape""" + all_circles = [] + pi = 3.14159 + + def __init__(self, rad=1, x=0, y=0): + """inheritin from the base class Shape""" + super().__init__(x, y) + """Creates a Circle with the given radius""" + self.radius = rad + self.__class__.all_circles.append(self) + + def area(self): + """determine the area of the Circle""" + return self.__class__.pi * self.radius * self.radius + + def circumference(self): + return 2 * self.radius * Circle.pi + + @classmethod + def total_area(cls): + total = 0 + for c in cls.all_circles: + total = total + c.area() + return total + + @classmethod + def total_circ(cls): + """class method to total the circumference of all circles created """ + total = 0 + for c in cls.all_circles: + total = total + c.circumference() + return total + +class Rectangle(Shape): + """Rectangle class inhering from Shape""" + def __init__(self, arg1=1, arg2=2, x=0, y=0): + """assigning measurment for two sides of the rectangle""" + super().__init__(x, y) + self.__height = arg1 + self.__width = arg2 + +# """making hieght and width variables private is by using double underscores before their name. +# it makes them safe from name clash and accidental change in other programs. +# however there's no way to access private variables from instance attributes. +# unless explicitally prepended by class name. +# Or there should be getter and setter defined for them with @property decorator.""" + +@property +def height(self): + return self.__height + + @height.setter + def height(self, value): + if value <= 0: + raise ValueError('Height must be a positive number.') + self.__height = value + + @property + def width(self): + return self.__width + + @width.setter + def width(self, value): + if value <= 0: + raise ValueError('Width must be a positive number.') + self.__width = value + + + def area(self): + """calculating the area of rectangle""" + return self.__height * self.__width + + def perimeter(self): + """calculating the perimeter of ractangle""" + return 2*self.__height + 2*self.__width + +"""it makes sense for square class to ingerit from rectangle class, +as it is just a rectangle with both sides the same size. +the area method can be ingerited by square from regtangle but it cannot be put into +shape class and be inherited by circle class, +because the formula for the area of a circle is different and not the same as rectangle.""" + +class Square(Rectangle): + def __init__(self, arg=1): + self.arg1 = arg + self.arg2 = arg + Rectangle.__init__(self, self.arg1, self.arg2) + + +#testing Rectangle class +rec = Rectangle(2,3) +print(rec.area()) +print(rec.perimeter()) +rec.move(5,5) +print((rec.x,rec.y)) + + +#testing Square class +squ = Square(2) +print(squ.area()) +print((squ.x,squ.y)) + + diff --git a/ch15-trythis3.py b/ch15-trythis3.py new file mode 100644 index 0000000..ae1cb6d --- /dev/null +++ b/ch15-trythis3.py @@ -0,0 +1,38 @@ +'''Try this: Class methods +Write a class method similar to total_area() that returns the total circumference of +all circles.''' + +"""circle module: contains the Circle class.""" +class Circle(Shape): + """Circle class""" + all_circles = [] + pi = 3.14159 + + def __init__(self, r=1, x=0, y=0): + """inheritin from the base class Shape""" + super().__init__(x, y) + """Create a Circle with the given radius""" + self.radius = r + self.__class__.all_circles.append(self) + + def area(self): + """determine the area of the Circle""" + return self.__class__.pi * self.radius * self.radius + + def circumference(self): + return 2 * self.radius * Circle.pi + + @classmethod + def total_area(cls): + total = 0 + for c in cls.all_circles: + total = total + c.area() + return total + + @classmethod + def total_circ(cls): + """class method to total the circumference of all circles created """ + total = 0 + for c in cls.all_circles: + total = total + c.circumference() + return total \ No newline at end of file diff --git a/ch15csmodule.py b/ch15csmodule.py new file mode 100644 index 0000000..d3d19bf --- /dev/null +++ b/ch15csmodule.py @@ -0,0 +1,65 @@ +"""cs module: class scope demonstration module.""" +mv ="module variable: mv" +def mf(): + return "module function (can be used like a class method in " \ + "other languages): mf()" +class SC: + scv = "superclass class variable: self.scv" + __pscv = "private superclass class variable: no access" + def __init__(self): + self.siv = "superclass instance variable: self.siv " \ + "(but use SC.siv for assignment)" + self.__psiv = "private superclass instance variable: " \ + "no access" + def sm(self): + return "superclass method: self.sm()" + def __spm(self): + return "superclass private method: no access" +class C(SC): + cv = "class variable: self.cv (but use C.cv for assignment)" + __pcv = "class private variable: self.__pcv (but use C.__pcv " \ + "for assignment)" + def __init__(self): + SC.__init__(self) + self.__piv = "private instance variable: self.__piv" + def m2(self): + return "method: self.m2()" + def __pm(self): + return "private method: self.__pm()" + def m(self, p="parameter: p"): + lv = "local variable: lv" + self.iv = "instance variable: self.xi" + print("Access local, global and built-in " \ + "namespaces directly") + print("local namespace:", list(locals().keys())) + print(p) #1 Parameter + + print(lv) #2 Local variable + print("global namespace:", list(globals().keys())) + + print(mv) #3 Module variable + + print(mf()) #4 Module function + print("Access instance, class, and superclass namespaces " \ + + + "through 'self'") + print("Instance namespace:",dir(self)) + + print(self.iv) #5 Instance variable + + print(self.__piv) #6 Private instance variable + + print(self.siv) #7 Superclass instance variable + print("Class namespace:",dir(C)) + print(self.cv) #8 Class variable + + print(self.m2()) #9 Method + + print(self.__pcv) #10 Private class variable + + print(self.__pm()) #11 Private method + print("Superclass namespace:",dir(SC)) + print(self.sm()) #12 Superclass method + + print(self.scv) #13 Superclass class variable through instance diff --git a/ch4-quickcheck1.py b/ch4-quickcheck1.py new file mode 100644 index 0000000..1dc213a --- /dev/null +++ b/ch4-quickcheck1.py @@ -0,0 +1,23 @@ +# Chapter 4 Quick check 1 +# QUICK CHECK: PYTHONIC STYLE +''' Which of the following variable and function names do you think are not good Pythonic style? + Why? +bar(), varName, VERYLONGVARNAME, foobar, longvarname, +foo_bar(), really_very_long_var_name ''' + +bar() # good, functions should be all lowercase + +varName # not good, variable names should be all lowercase +varname + +VERYLONGVARNAME # not good, variable names should be all lowercase, underscores_for_readablitiy +very_long_var_name + +foobar # good + +longvarname # not good, variable names should be all lowercase, underscores_for_readablitiy +long_var_name + +foo_bar() # good, functions should be all lowercase, underscores_for_readablitiy + +really_very_long_var_name # good, variable names should be all lowercase, underscores_for_readablitiy \ No newline at end of file diff --git a/ch4-trythis1.py b/ch4-trythis1.py new file mode 100644 index 0000000..3b44726 --- /dev/null +++ b/ch4-trythis1.py @@ -0,0 +1,30 @@ +# Chapter 4 Try this 1 +# TRY THIS: VARIABLES AND EXPRESSIONS 1 + +x = 5 +y = 'is' +-y = 7 +4g = 0 +@hh = 100 +print(x) + ll = 2 + +expression = x + y +print(expression) + +test 0 +test1 = 5 + 9 * 4 / 5 +print(test1) +test2 = 5 + (9 * 4) / 5 +print(test2) + +print(3 / 5) +print(3 // 5) + +mm = x = 2 + 4 * 5 – 6 / 3 +mm = x = 2 + 4 * 5 - 6 / 3 +print(mm) + +nn = x = 2 + 4 * (5 - 6) / 3 +print(nn) + diff --git a/ch4-trythis2.py b/ch4-trythis2.py new file mode 100644 index 0000000..eb39ca9 --- /dev/null +++ b/ch4-trythis2.py @@ -0,0 +1,50 @@ +# Chapter 4 Try this 2 +#TRY THIS: MANIPULATING STRINGS AND NUMBERS + +this_one = 'one' +print (this_one) +That = 'test this' +print(That) +#my-name = "my" +my_name = 'my' +print(my_name) +your_name = "your" +print(your_name) +print(type(your_name)) +together = That + my_name +print(together) +together = That +" "+ my_name +print(together) +#print(your_name - my_name) +print(That*4) +print((That +' ')*3) +#print(my_name *2.5) + + +#testing math and cmath +from math import * +q=5 +w=6 +e=7.2 +print(w*q) +print(q*e) +print(e+w) +y=sqrt(w) +u=pow(q,3) +print(u) +print(y) +print(sin(30)) +r=1-9j +t=2+8j +print(r*t) +from cmath import * +print(w*q) +y=sqrt(w) +print(y) +import math +print(math.sqrt(w)) +print(sqrt(-1)) +print(pow(w,4)) + + + diff --git a/ch4-trythis3.py b/ch4-trythis3.py new file mode 100644 index 0000000..725a49b --- /dev/null +++ b/ch4-trythis3.py @@ -0,0 +1,17 @@ +# Chapter 4 Try this 3 +# TRY THIS: GETTING INPUT + +city = input('Where do you live? ') +print('Welcome to %s.' %city) +dob = int(input('Which year were you born? ')) +#today = input('What year is it? ') +today = int(input('What year is it? ')) + +age = today - dob +print('You are %s years old.' %age) + +weight = float(input('your weight in kg? ')) +height = float(input('your height in m? ')) + +BMI = weight/height**2 +print('your BMI is: ',BMI) \ No newline at end of file diff --git a/ch5-lab5.py b/ch5-lab5.py new file mode 100644 index 0000000..6506aa5 --- /dev/null +++ b/ch5-lab5.py @@ -0,0 +1,37 @@ +''' +Lab 5: Examining a List +In this lab, the task is to read a set of temperature data (the monthly high temperatures +at Heathrow Airport for 1948 through 2016) from a file and then find some basic information: + the highest and lowest temperatures, the mean (average) temperature, +and the median temperature (the temperature in the middle if all the temperatures are sorted). +The temperature data is in the file lab_05.txt in the source code directory for thischapter. + Because I haven’t yet discussed reading files, here’s the code to read the files into a list: +temperatures = [] +with open('lab_05.txt') as infile: +for row in infile: +temperatures.append(int(row.strip()) +You should find the highest and lowest temperature, the average, and the median. +You’ll probably want to use the min(), max(), sum(), len(), and sort() functions/methods. +Bonus +Determine how many unique temperatures are in the list. +''' +temperatures = [] +with open('lab_05.txt') as infile: + for row in infile: + temperatures.append(float(row.strip())) + +min_temp = min(temperatures) +max_temp = max(temperatures) +mean_temp = round(sum(temperatures)/len(temperatures), 2) +sorting = temperatures[:] +sorting.sort() +middle_index = len(temperatures)//2 +median_temp = sorting[middle_index] + +print('lowest temperatures: ', min_temp) +print('highest temperatures: ', max_temp) +print('mean/average temperatures: ', mean_temp) +print('median/middle temperatures: ', median_temp) +print('number of all temperatures: ', len(temperatures) ) +unique = set(temperatures) +print('number of unique temperatures: ', len(unique)) diff --git a/ch5-quickcheck1.py b/ch5-quickcheck1.py new file mode 100644 index 0000000..b273f27 --- /dev/null +++ b/ch5-quickcheck1.py @@ -0,0 +1,7 @@ +''' +Quick Check: len() +What would len() return for each of the following: [0]; []; [[1, 3, [4, 5], 6], 7]? +''' +print(len([0])) +print(len([])) +print(len([[1, 3, [4, 5], 6], 7])) diff --git a/ch5-quickcheck2.py b/ch5-quickcheck2.py new file mode 100644 index 0000000..e30f219 --- /dev/null +++ b/ch5-quickcheck2.py @@ -0,0 +1,27 @@ +''' +Quick Check: List Operations +What would be the result of len([[1,2]] * 3)? +What are two differences between using the in operator and a list’s index() method? +Which of the following will raise an exception?: min(["a", "b", "c"]); max([1, 2, "three"]); [1, 2, 3].count("one") +''' + +x = [[1,2]] * 3 +print(x) +print(len(x)) + +y = [9, 8, 7, 0, 1, 7] +print(2 in y) #returns only boolean, no more information of the position +print(8 in y) +print(y.index(7)) #returns the position of only the first occurance +#print(y.index(2)) #returns Traceback ValueError: 2 is not in list + + +print(min(["a", "b", "c"])) + +#print(max([1, 2, "three"])) #TypeError: '>' not supported between instances of 'str' and 'int' + +print([1, 2, 3].count("one")) + + + + diff --git a/ch5-quickcheck3.py b/ch5-quickcheck3.py new file mode 100644 index 0000000..5ea60f8 --- /dev/null +++ b/ch5-quickcheck3.py @@ -0,0 +1,17 @@ +''' +Quick Check: Tuples +Explain why the following operations aren’t legal for the tuple x = (1, 2, 3, 4): +x.append(1) +x[1] = "hello" +del x[2] +If you had a tuple x = (3, 1, 4, 2), how might you end up with x sorted? +''' + +x = (1, 2, 3, 4) +x.append(1) #Traceback AttributeError: 'tuple' object has no attribute 'append' +x[1] = "hello" #Traceback TypeError: 'tuple' object does not support item assignment +del x[2] #Traceback TypeError: 'tuple' object doesn't support item deletion + +y = (3, 1, 4, 2) +print(sorted(y)) #[1, 2, 3, 4] +print(type(sorted(y))) # turns the tuple to list then sorts diff --git a/ch5-quickcheck4.py b/ch5-quickcheck4.py new file mode 100644 index 0000000..049ebce --- /dev/null +++ b/ch5-quickcheck4.py @@ -0,0 +1,9 @@ +''' +Quick Check: Sets +If you were to construct a set from the following list, how many elements would the set +have?: [1, 2, 5, 1, 0, 2, 3, 1, 1, (1, 2, 3)] +''' + +x = set([1, 2, 5, 1, 0, 2, 3, 1, 1, (1, 2, 3)]) +print(x) +print(len(x)) \ No newline at end of file diff --git a/ch5-trythis1.py b/ch5-trythis1.py new file mode 100644 index 0000000..2c25642 --- /dev/null +++ b/ch5-trythis1.py @@ -0,0 +1,10 @@ +''' +Try this: List slices and indexes +Using what you know about the len() function and list slices, how would you combine +the two to get the second half of a list when you don’t know what size it is? +Experiment in the Python shell to confirm that your solution works. +''' + +x = [00, 11, 22, 33, 44, 55, 66, 77, 88] +y = x[len(x)//2:] +print(y) \ No newline at end of file diff --git a/ch5-trythis2.py b/ch5-trythis2.py new file mode 100644 index 0000000..6b67fb7 --- /dev/null +++ b/ch5-trythis2.py @@ -0,0 +1,8 @@ +''' +Try this: Modifying lists +Suppose that you have a list 10 items long. How might you move the last three items +from the end of the list to the beginning, keeping them in the same order? +''' + +x = [00, 11, 22, 33, 44, 55, 66, 77, 88, 99] +print(x[-3:] + x[:-3]) \ No newline at end of file diff --git a/ch5-trythis3.py b/ch5-trythis3.py new file mode 100644 index 0000000..8a736e7 --- /dev/null +++ b/ch5-trythis3.py @@ -0,0 +1,14 @@ +''' +Try this: Sorting lists +Suppose that you have a list in which each element is in turn a list: [[1, 2, 3], [2, 1, 3], [4, 0, 1]]. +If you wanted to sort this list by the second element in each list +so that the result would be [[4, 0, 1], [2, 1, 3], [1, 2, 3]], what function +would you write to pass as the key value to the sort() method? +''' + +def second_item(in_list): + return in_list[1] + +x = [[1, 2, 3], [2, 1, 3], [4, 0, 1]] +x.sort(key = second_item) +print(x) \ No newline at end of file diff --git a/ch5-trythis4.py b/ch5-trythis4.py new file mode 100644 index 0000000..23053c7 --- /dev/null +++ b/ch5-trythis4.py @@ -0,0 +1,26 @@ +''' +Try this: List operations +If you have a list x, write the code to safely remove an item if—and only if—that value is in the list. +Modify that code to remove the element only if the item occurs in the list more than once. +''' + +def remove_if_is(x, item): + if item in x: + x.remove(item) + return x + else: + return 'item not in the list' + +def remove_first_one(x, item): + if x.count(item) > 1: + x.remove(item) + return x + else: + return 'item less then twice in list' + +y = [0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4] + +print(remove_if_is(y, 0)) +print(remove_if_is(y, 7)) +print(remove_first_one(y, 2)) +print(remove_first_one(y, 6)) diff --git a/ch5-trythis5.py b/ch5-trythis5.py new file mode 100644 index 0000000..3f762bb --- /dev/null +++ b/ch5-trythis5.py @@ -0,0 +1,24 @@ +''' +Try this: List copies +Suppose that you have the following list: x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] +What code could you use to get a copy y of that list in which you could change the +elements without the side effect of changing the contents of x? +''' +x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] + + +shallow = x[:] +print('shallow ', shallow) + +import copy +deep = copy.deepcopy(x) + +print('deep ', deep) + +del deep[1][1] +print('deep after del ', deep) +print('x after deep del ', x) + +del shallow[2][2] +print('shallow after del ', shallow) +print('x after shallow del ', x) \ No newline at end of file diff --git a/ch6-lab6.py b/ch6-lab6.py new file mode 100644 index 0000000..8fac075 --- /dev/null +++ b/ch6-lab6.py @@ -0,0 +1,36 @@ +''' +Lab 6: Preprocessing Text +In processing raw text, it’s quite often necessary to clean and normalize the text before doing anything else. +If you want to find the frequency of words in text, for example, you can make the job easier if, +before you start counting, you make sure that everything is lowercase (or uppercase, if you prefer) +and that all punctuation has been removed. You can also make things easier by breaking the text into a series of words. +In this lab, the task is to read the first part of the first chapter of Moby Dick (found in the book’s source code), +make sure that everything is one case, remove all punctuation, and write the words one per line to a second file. +Because I haven’t yet covered reading and writing files, here’s the code for those operations: +with open("moby_01.txt") as infile, open("moby_01_clean.txt", "w") as outfile: +for line in infile: +# make all one case +# remove punctuation +# split into words +# write all words for line +outfile.write(cleaned_words) +''' +with open("moby_01.txt") as infile, open("moby_01_clean.txt", "w") as outfile: + words_list = [] + for line in infile: +# make all one case + lower_case = line.lower() +# remove punctuation + table = lower_case.maketrans('.,?;:!"-_][)(\'',' '*14) + sans_punct = lower_case.translate(table) +# split into words + line_list = sans_punct.split() +# write all words for line + words_list = words_list + line_list + cleaned_words = '\n'.join(words_list) + outfile.write(cleaned_words) + +# see the outfile +with open('moby_01_clean.txt','r') as outfile: + for each in outfile: + print(each, end = "") \ No newline at end of file diff --git a/ch6-quickcheck1.py b/ch6-quickcheck1.py new file mode 100644 index 0000000..1ddd40e --- /dev/null +++ b/ch6-quickcheck1.py @@ -0,0 +1,11 @@ +''' +Quick Check: split and join +How could you use split and join to change all the whitespace in string x to dashes, +such as changing "this is a test" to "this—is—a—test""? +''' +x = "this is a test" + +x = '—'.join(x.split()) + +print(x) + diff --git a/ch6-quickcheck2.py b/ch6-quickcheck2.py new file mode 100644 index 0000000..319ad63 --- /dev/null +++ b/ch6-quickcheck2.py @@ -0,0 +1,12 @@ +''' +Quick Check: Strings to Numbers +Which of the following will not be converted to numbers, and why? +int('a1') +int('12G', 16) +float("12345678901234567890") +int("12*2") +''' +#int('a1') ValueError: invalid literal for int() with base 10: 'a1' +#int('12G', 16) ValueError: invalid literal for int() with base 16: '12G' +float("12345678901234567890") +#int("12*2") ValueError: invalid literal for int() with base 10: '12*2' \ No newline at end of file diff --git a/ch6-quickcheck3.py b/ch6-quickcheck3.py new file mode 100644 index 0000000..e92d8a7 --- /dev/null +++ b/ch6-quickcheck3.py @@ -0,0 +1,15 @@ +''' +Quick Check: strip +If the string x equals "(name, date),\n", which of the following would return a +string containing "name, date"? +x.rstrip("),") +x.strip("),\n") +x.strip("\n)(,") +''' + +x = "(name, date),\n" + + +print(x.rstrip("),")) # (name, date), +print(x.strip("),\n")) # (name, date +print(x.strip("\n)(,")) # name, date #correct diff --git a/ch6-quickcheck4.py b/ch6-quickcheck4.py new file mode 100644 index 0000000..0197bca --- /dev/null +++ b/ch6-quickcheck4.py @@ -0,0 +1,10 @@ +''' +Quick Check: String searching +If you wanted to check whether a line ends with the string "rejected", +what string method would you use? +Would there be any other ways to get the same result? +''' + +line.endswith("rejected") + +line[-8:] == "rejected" \ No newline at end of file diff --git a/ch6-quickcheck5.py b/ch6-quickcheck5.py new file mode 100644 index 0000000..118142b --- /dev/null +++ b/ch6-quickcheck5.py @@ -0,0 +1,10 @@ +''' +Quick Check: Modifying strings +What would be a quick way to change all punctuation in a string to spaces? +''' +x = 'q,w.e:r;t"y-u?i!o_p[a]s)d(f\'g' + +table = x.maketrans('.,?;:!"-_][)(\'',' '*14) +y = x.translate(table) + +print(y) \ No newline at end of file diff --git a/ch6-quickcheck6.py b/ch6-quickcheck6.py new file mode 100644 index 0000000..3973a55 --- /dev/null +++ b/ch6-quickcheck6.py @@ -0,0 +1,23 @@ +''' +Quick Check: the format() method +What will be in x when the following snippets of code are executed?: +x = "{1:{0}}".format(3, 4) +x = "{0:$>5}".format(3) +x = "{a:{b}}".format(a=1, b=5) +x = "{a:{b}}:{0:$>5}".format(3, 4, a=1, b=5, c=10) +''' +x = "{1:{0}}".format(3, 4) +print(x) +x = "{0:$>5}".format(3) +print(x) +x = "{a:{b}}".format(a=1, b=5) +print(x) +x = "{a:{b}}:{0:$>5}".format(3, 4, a=1, b=5, c=10) +print(x) + +''' + 4 +$$$$3 + 1 + 1:3$$$$ +''' \ No newline at end of file diff --git a/ch6-quickcheck7.py b/ch6-quickcheck7.py new file mode 100644 index 0000000..8eca295 --- /dev/null +++ b/ch6-quickcheck7.py @@ -0,0 +1,13 @@ +''' +Quick Check: Formatting strings with % +What would be in the variable x after the following snippets of code have executed? +x = "%.2f" % 1.1111 +x = "%(a).2f" % {'a':1.1111} +x = "%(a).08f" % {'a':1.1111} +''' +x = "%.2f" % 1.1111 +print(x) # 1.11 +x = "%(a).2f" % {'a':1.1111} +print(x) # 1.11 +x = "%(a).08f" % {'a':1.1111} +print(x) # 1.11110000 \ No newline at end of file diff --git a/ch6-quickcheck8.py b/ch6-quickcheck8.py new file mode 100644 index 0000000..82dfcea --- /dev/null +++ b/ch6-quickcheck8.py @@ -0,0 +1,15 @@ +''' +Quick Check: Bytes +For which of the following kinds of data would you want to use a string? +For which could you use bytes? +1 Data file storing binary data +2 Text in a language with accented characters +3 Text with only uppercase and lowercase roman characters +4 A series of integers no larger than 255 +''' + + +1 Data file storing binary data # bytes, binary numbers +2 Text in a language with accented characters # string, unicode covers accent +3 Text with only uppercase and lowercase roman characters # string, text +4 A series of integers no larger than 255 # bytes, integers in range \ No newline at end of file diff --git a/ch6-trythis1.py b/ch6-trythis1.py new file mode 100644 index 0000000..9c0ae35 --- /dev/null +++ b/ch6-trythis1.py @@ -0,0 +1,26 @@ +''' +Try this: String operations +Suppose that you have a list of strings in which some (but not necessarily all) + of the strings begin and end with the double quote character: +x = ['"abc"', 'def', '"ghi"', '"klm"', 'nop'] +What code would you use on each element to remove just the double quotes? +What code could you use to find the position of the last p in Mississippi? +When you’ve found that position, what code would you use to remove just that letter? +''' +x = ['"abc"', 'def', '"ghi"', '"klm"', 'nop'] + +y = [] +for i in x: + n = i.strip('"') + y.append(n) +x = y +print(x) + +##################### +m = "Mississippi" +n = [] +for i in m: + n.append(i) +del(n[m.rfind("p")]) +l =''.join(n) +print(l) diff --git a/ch7-lab7.py b/ch7-lab7.py new file mode 100644 index 0000000..b135510 --- /dev/null +++ b/ch7-lab7.py @@ -0,0 +1,30 @@ +''' +Lab 7: Word Counting +In the previous lab, you took the text of the first chapter of Moby Dick, normalized the case, +removed punctuation, and wrote the separated words to a file. +In this lab, you read that file, use a dictionary to count the number of times each word occurs, +and then report the most common and least common words. +''' + +with open("moby_01_clean.txt") as infile: + word_count = {} + for word in infile: + word_count[word] = word_count.get(word, 0) + 1 + +maxi = max(list(word_count.values())) +mini = min(list(word_count.values())) + +most_common = [] +least_common = [] + +for key in list(word_count.keys()): + if word_count[key] >= maxi - 7: + most_common.append(key.strip("\n")) + + if word_count[key] == mini: + least_common.append(key.strip("\n")) + + +print('''In the first chapter of Moby Dick\nThe most common words are {0} with {1} to {2} times of occorance.\n + The least common words are {3} with only {4} times of occurance.'''.format( + most_common, maxi - 7 , maxi , least_common, mini )) diff --git a/ch7-quickcheck1.py b/ch7-quickcheck1.py new file mode 100644 index 0000000..6386863 --- /dev/null +++ b/ch7-quickcheck1.py @@ -0,0 +1,16 @@ +''' +Quick Check: Dictionary operations +Assume that you have a dictionary x = {'a':1, 'b':2, 'c':3, 'd':4} and a +dictionary y = {'a':6, 'e':5, 'f':6}. +What would be the contents of x after the following snippets of code have executed?: +del x['d'] +z = x.setdefault('g', 7) +x.update(y) +''' +x = {'a':1, 'b':2, 'c':3, 'd':4} +y = {'a':6, 'e':5, 'f':6} + +del x['d'] # {'a': 1, 'b': 2, 'c': 3} +z = x.setdefault('g', 7) # {'a': 1, 'b': 2, 'c': 3, 'g': 7} +x.update(y) +print(x) # {'a': 6, 'b': 2, 'c': 3, 'g': 7, 'e': 5, 'f': 6} \ No newline at end of file diff --git a/ch7-quickcheck2.py b/ch7-quickcheck2.py new file mode 100644 index 0000000..c7ecc74 --- /dev/null +++ b/ch7-quickcheck2.py @@ -0,0 +1,12 @@ +''' +Quick Check: What can be a key? +Decide which of the following expressions can be a dictionary key: + 1; 'bob'; ('tom', [1, 2, 3]); ["filename"]; "filename"; ("filename", "extension") +''' + +1; #can, number: immutable, hashable +'bob'; #can, string: immutable, hashable +('tom', [1, 2, 3]); #cannot, list item in a tuple: mutable +["filename"]; #cannot, list: mutable +"filename"; #can, string: immutable, hashable +("filename", "extension") #can, tuple with string items \ No newline at end of file diff --git a/ch7-trythis1.py b/ch7-trythis1.py new file mode 100644 index 0000000..4301fe3 --- /dev/null +++ b/ch7-trythis1.py @@ -0,0 +1,18 @@ +''' +Try this: Create a dictionary +Write the code to ask the user for three names and three ages. After the names and ages +are entered, ask the user for one of the names, and print the correct age. +''' + +nameage_dict = {} +for i in range(0,3): + name = str(input("Enter your name: ")) + age = int(input("Enter your age: ")) + nameage_dict[name] = age + +who = input("Whose age do you want? ") + +if who in nameage_dict: + print("{}'s age is: ".format(who)) +else: + print("Sorry, there is no {} in the records".format(who)) diff --git a/ch7-trythis2.py b/ch7-trythis2.py new file mode 100644 index 0000000..51c868f --- /dev/null +++ b/ch7-trythis2.py @@ -0,0 +1,14 @@ +''' +Try this: Using dictionaries +Suppose that you’re writing a program that works like a spreadsheet. +How might you use a dictionary to store the contents of a sheet? +Write some sample code to both store a value and retrieve a value in a particular cell. +What might be some drawbacks to this approach? +''' + +spreadsheet = {} + +x = input('enter x index of cell: ') +y = input('enter x index of cell: ') + +cell_content = spreadsheet.get((x, y), input('enter content for this cell: ')) diff --git a/ch8-lab8.py b/ch8-lab8.py new file mode 100644 index 0000000..4bc63d1 --- /dev/null +++ b/ch8-lab8.py @@ -0,0 +1,20 @@ +''' +Lab 8: Refactor word_count +Rewrite the word_count program from section 8.7 to make it shorter. +You may want to look at the string and list operations already discussed, as well as think about different +ways to organize the code. You may also want to make the program smarter so that only +alphabetic strings (not symbols or punctuation) count as words. +''' + +line_count = 0 +word_count = 0 +char_count = 0 + +with open('word_count.txt') as infile: + for line in infile: + line_count += 1 + char_count += len(line) + words = line.split() + word_count += len(words) + +print("File has {0} lines, {1} words, {2} characters".format(line_count, word_count, char_count)) \ No newline at end of file diff --git a/ch8-quickcheck1.py b/ch8-quickcheck1.py new file mode 100644 index 0000000..265a410 --- /dev/null +++ b/ch8-quickcheck1.py @@ -0,0 +1,13 @@ +''' +Quick Check: Booleans and truthiness +Decide whether the following statements are true or false: + 1, 0, -1, [0], 1 and 0, 1 > 0 or []. +''' + +print("1", 1 == True) #True +print("0", 0 == True) #False +print("-1", -1 == True) #False +print("[0]", [0] is True) #False +print("1 and 0", 1 and 0 == True) #False +print("1 > 0 or []", 1 > 0 or [] is True) #True + diff --git a/ch8-trythis1.py b/ch8-trythis1.py new file mode 100644 index 0000000..637d7a1 --- /dev/null +++ b/ch8-trythis1.py @@ -0,0 +1,45 @@ +''' +Try this: Looping and if statements +Suppose that you have a list x = [1, 3, 5, 0, -1, 3, -2], and you need to +remove all negative numbers from that list. Write the code to do this. +''' +x = [1, 3, 5, 0, -1, 3, -2] +j = 0 +for i in range(len(x)): + if x[i - j] < 0: + del(x[i - j]) + j += 1 +print(x) + +''' +How would you count the total number of negative numbers in a list +y = [[1, -1, 0], [2, 5, -9], [-2, -3, 0]]? +''' +y = [[1, -1, 0], [2, 5, -9], [-2, -3, 0]] +tot = 0 +for i in range(len(y)): + for j in range(len(y[i])): + if y[i][j] < 0: + tot = tot + y[i][j] +print('total of negatives: ', tot) + +''' +What code would you use to print very low if the value of x is below -5, low if it’s +from -5 up to 0, neutral if it’s equal to 0, high if it’s greater than 0 up to 5, and very +high if it’s greater than 5? +''' +def ranking(x): + if x < -5: + print('x is very low') + elif x < 0: + print('x is low') + elif x == 0: + print('x is neutral') + elif x < 5: + print('x is high') + else: + print('x is very high') +# test +for i in range(-7 , 7): + print(i) + ranking(i) diff --git a/ch8-trythis2.py b/ch8-trythis2.py new file mode 100644 index 0000000..becc621 --- /dev/null +++ b/ch8-trythis2.py @@ -0,0 +1,21 @@ +''' +Try this: Comprehensions +What list comprehension would you use to process the list x so that all negative values +are removed? +''' +x = [1, 3, 5, 0, -1, 3, -2] +x = [item for item in x if item > -1] +print(x) +''' +Create a generator that returns only odd numbers from 1 to 100. +(Hint: A number is odd if there is a remainder if divided by 2; use % 2 to get the remainder of division by 2.) +''' +odd = (i for i in range(1, 100) if i % 2 > 0) +#test +for o in odd: + print(o) +''' +Write the code to create a dictionary of the numbers and their cubes from 11 through 15. +''' +xcubes = {x : x*x for x in range(11,16)} +print(xcubes) \ No newline at end of file diff --git a/ch9-lab9.py b/ch9-lab9.py new file mode 100644 index 0000000..d65b447 --- /dev/null +++ b/ch9-lab9.py @@ -0,0 +1,80 @@ +''' +Lab 9: Useful functions +Looking back at the labs in chapters 6 and 7 , refactor that code into functions for +cleaning and processing the data. +The goal should be that most of the logic is moved into functions. +Use your own judgment as to the types of functions and parameters, but +keep in mind that functions should do just one thing, and they shouldn’t have any side +effects that carry over outside the function. +''' + +# removing punctuation refactored into funtion +def remove_punc(string): + table = string.maketrans('.,?;:!"-_][)(\'',' '*14) + return string.translate(table) + +# counting words refactored into funtion +def w_counter(text): + counted = {} + for word in text: + counted[word] = counted.get(word, 0) + 1 + return counted + +# cleaning file refactored into funtion +def cleaner(text): + words_list = [] + for line in text: + lower_case = line.lower() + sans_punct = remove_punc(lower_case) + line_list = sans_punct.split() + words_list = words_list + line_list + return '\n'.join(words_list) + +# finding most common refactored into funtion +def most_finder(counted_dict): + global maxi + maxi = max(list(counted_dict.values())) + most = [] + for key in list(counted_dict.keys()): + if counted_dict[key] >= maxi - 7: + most.append(key.strip("\n")) + return most + +# finding least common refactored into funtion +def least_finder(counted_dict): + global mini + mini = min(list(counted_dict.values())) + least = [] + for key in list(counted_dict.keys()): + if counted_dict[key] == mini: + least.append(key.strip("\n")) + return least + + +#lab6 refactored +with open("moby_01.txt") as infile, open("moby_01_clean.txt", "w") as outfile: + cleaned_words = cleaner(infile) + outfile.write(cleaned_words) + +# see the outfile +with open('moby_01_clean.txt','r') as outfile: + for each in outfile: + print(each, end = "") + + +#lab7 refactored +with open("moby_01_clean.txt") as infile: + word_count = w_counter(infile) +most_common = most_finder(word_count) +least_common = least_finder(word_count) + + +print('''In the first chapter of Moby Dick\nThe most common words are + {0} with {1} to {2} times of occorance.\n + The least common words are {3} with only {4} times of occurance.'''.format( + most_common, maxi - 7 , maxi , least_common, mini )) + + + + + diff --git a/ch9-quickcheck1.py b/ch9-quickcheck1.py new file mode 100644 index 0000000..ec078df --- /dev/null +++ b/ch9-quickcheck1.py @@ -0,0 +1,43 @@ +''' +Quick Check: Functions and parameters +How would you write a function that could take any number of unnamed arguments +and print their values out in reverse order? +''' +# if reverse order mean descending order: +def reverser(*a): + my_list = [*a] + my_list.sort(reverse = True) + for j in my_list: + print(j) + +reverser(8,5,4,1,3,9,7) +# if reverse means LIFO: + +def lifo(*args): + my_list = [*args] + my_list.reverse() + for i in my_list: + print(i) + +lifo('i','c','a','n') + + +''' +What do you need to do to create a procedure or void function—that is, a function with +no return value? +''' +# There would not be a return statement at the end of the function. +# Or there would not be anything in front of the return statement. +# The funtion can do one of the following to still be productive: +## The procedure might make some changanes to a mutable type, which would hold outside the function. +## Or it can print something in terminal. +## Or it may save a file locally or push a code ... + + +'''What happens if you capture the return value of a function with a variable?''' +# it is possible to use that variable as any other variable then. + + + + + diff --git a/ch9-quickcheck2.py b/ch9-quickcheck2.py new file mode 100644 index 0000000..8ad4b1d --- /dev/null +++ b/ch9-quickcheck2.py @@ -0,0 +1,13 @@ +''' +Quick Check: Mutable function parameters +What would be the result of changing a list or dictionary that was passed into a function +as a parameter value? +Which operations would be likely to create changes that would be +visible outside the function? What steps might you take to minimize that risk? +''' +# The changes would hold outside the function as those are mutable data types. + +# Operations like del, append, +, *, decreasing or increasing the list or dictionary by slice notation... + +# It is possible to avoid modifying a list or dict by making a copy of them by .copy() and .deepcopy() +# and working with that copy. Though it would be wise to refrain from using mutable data types altogether. \ No newline at end of file diff --git a/ch9-quickcheck3.py b/ch9-quickcheck3.py new file mode 100644 index 0000000..ca6ebf5 --- /dev/null +++ b/ch9-quickcheck3.py @@ -0,0 +1,18 @@ +''' +Quick Check: Generator functions +What would you need to modify in the previous code for the function four()to make it +work for any number? +What would you need to add to allow the starting point to also be +set? +''' + +def any_number(starts, any): + x = starts + while x < any: + print("in generator, x =", x) + yield x + x += 1 + + +for _ in any_number(5, 9): + print(_) diff --git a/ch9-trythis1.py b/ch9-trythis1.py new file mode 100644 index 0000000..7ef7e9e --- /dev/null +++ b/ch9-trythis1.py @@ -0,0 +1,26 @@ + +''' +Try this: Global vs. local variables +Assuming that x = 5, what will be the value of x after funct_1() below executes? +After funct_2() executes? +def funct_1(): +x = 3 +def funct_2(): +global x +x = 2 +''' + +x = 5 + +def funct_1(): + x = 3 + +funct_1() +print(x) #5 + +def funct_2(): + global x + x = 2 + +funct_2() +print(x) #2 \ No newline at end of file diff --git a/ch9-trythis2.py b/ch9-trythis2.py new file mode 100644 index 0000000..d5cd602 --- /dev/null +++ b/ch9-trythis2.py @@ -0,0 +1,18 @@ +''' +Try this: Decorators +How would you modify the code for the decorator function to remove unneeded +messages and enclose the return value of the wrapped function in "" and " +", so that myfunction ("hello") would return "hello"? +''' + +def decorate(func): + def wrapper_func(*args): + return func('{}'.format(*args)) + return wrapper_func +## +@decorate +def myfunction(parameter): + print(parameter) + + +myfunction("meu meu") diff --git a/lab_05.txt b/lab_05.txt new file mode 100644 index 0000000..d8530bb --- /dev/null +++ b/lab_05.txt @@ -0,0 +1,828 @@ +8.9 +7.9 +14.2 +15.4 +18.1 +19.1 +21.7 +20.8 +19.6 +14.9 +10.8 +8.8 +8.5 +10.4 +9.3 +16.2 +17.1 +22.0 +25.1 +23.9 +22.8 +17.0 +10.2 +9.2 +7.1 +9.9 +12.3 +12.9 +17.2 +23.6 +21.6 +21.9 +17.6 +14.0 +9.3 +3.8 +7.3 +7.0 +8.4 +12.3 +15.0 +20.5 +23.0 +20.2 +19.2 +14.6 +11.8 +8.9 +6.2 +6.7 +10.6 +15.6 +19.6 +20.9 +23.3 +21.6 +16.4 +13.2 +7.5 +5.8 +5.6 +7.5 +11.1 +13.1 +18.7 +19.8 +21.0 +22.6 +19.5 +14.7 +11.3 +10.0 +5.9 +6.1 +10.4 +13.2 +16.8 +18.6 +19.2 +19.8 +18.0 +16.2 +11.2 +9.7 +5.6 +5.0 +7.9 +15.2 +15.5 +20.0 +24.4 +24.3 +19.9 +13.5 +10.7 +9.5 +7.0 +2.9 +11.0 +12.1 +19.1 +18.5 +20.9 +18.8 +19.2 +13.8 +9.3 +8.2 +8.7 +9.0 +13.9 +14.2 +16.2 +23.6 +22.5 +21.1 +17.6 +15.5 +9.4 +7.6 +6.8 +8.9 +8.1 +12.3 +17.3 +19.4 +21.7 +20.8 +20.0 +14.9 +9.7 +8.0 +5.7 +7.4 +11.9 +14.2 +18.7 +22.1 +24.7 +24.2 +22.7 +17.8 +10.8 +9.3 +6.9 +7.9 +10.2 +14.3 +18.4 +22.1 +20.1 +20.3 +18.5 +14.2 +11.2 +6.9 +6.9 +10.3 +13.9 +15.0 +16.8 +21.7 +22.1 +21.7 +20.9 +15.6 +9.9 +6.8 +7.9 +7.6 +7.4 +12.7 +15.0 +20.4 +20.6 +20.0 +17.8 +15.7 +9.1 +5.0 +0.8 +2.8 +10.7 +13.6 +16.0 +20.8 +21.1 +19.8 +18.0 +14.8 +11.8 +5.4 +5.8 +7.6 +7.6 +12.8 +19.6 +19.3 +22.8 +22.3 +21.1 +13.7 +11.2 +7.1 +6.6 +5.9 +10.5 +13.4 +16.8 +19.7 +19.3 +20.8 +17.4 +16.2 +8.4 +8.4 +5.3 +9.3 +10.9 +12.2 +17.0 +21.8 +20.1 +20.6 +19.6 +14.7 +8.8 +9.3 +7.3 +9.3 +11.6 +12.5 +15.6 +20.1 +23.5 +21.5 +18.5 +15.0 +9.7 +7.2 +7.2 +5.7 +11.1 +13.7 +15.4 +20.6 +20.7 +20.2 +18.8 +16.5 +9.5 +5.4 +8.9 +4.9 +8.0 +13.6 +17.1 +20.6 +23.9 +21.8 +19.6 +18.2 +9.6 +6.1 +7.1 +7.2 +8.1 +11.4 +19.2 +23.6 +21.3 +22.3 +20.3 +15.7 +11.9 +7.0 +7.8 +8.6 +9.1 +12.2 +18.1 +17.8 +24.1 +21.3 +20.7 +17.2 +10.4 +9.3 +6.9 +7.9 +12.4 +12.9 +16.0 +17.5 +22.3 +21.8 +17.3 +15.6 +9.9 +9.4 +7.3 +8.1 +11.5 +12.5 +16.9 +21.9 +21.4 +23.7 +20.7 +13.9 +10.3 +8.6 +9.6 +9.2 +10.3 +14.0 +17.0 +20.1 +20.9 +21.5 +17.5 +11.0 +10.6 +11.0 +10.3 +9.3 +8.4 +13.3 +15.1 +21.8 +24.1 +25.9 +19.5 +14.4 +10.1 +7.6 +8.8 +7.8 +9.5 +13.7 +19.3 +25.5 +26.6 +25.1 +19.0 +14.9 +9.9 +5.6 +6.1 +9.6 +11.2 +12.2 +16.4 +17.4 +22.4 +20.3 +18.0 +16.3 +10.4 +9.2 +6.7 +6.2 +11.3 +10.7 +17.2 +19.7 +20.5 +20.7 +20.1 +17.1 +12.6 +7.8 +3.8 +4.5 +9.2 +12.7 +15.9 +19.0 +22.5 +21.0 +19.6 +16.4 +10.8 +9.2 +6.0 +9.9 +9.0 +14.0 +17.3 +19.8 +19.7 +21.9 +20.1 +14.0 +9.3 +8.9 +8.1 +7.1 +11.8 +12.9 +16.1 +18.5 +22.0 +22.8 +20.3 +12.9 +11.5 +4.4 +6.9 +8.4 +11.1 +14.3 +18.0 +21.5 +22.7 +22.2 +20.8 +14.1 +11.4 +8.2 +10.0 +5.5 +10.8 +12.4 +15.6 +20.8 +27.6 +24.5 +19.3 +15.1 +11.3 +9.2 +8.0 +7.4 +8.9 +14.6 +14.9 +21.3 +24.2 +24.4 +18.6 +15.8 +12.2 +8.7 +4.1 +6.3 +9.4 +14.0 +16.4 +18.5 +22.9 +20.3 +20.6 +16.1 +8.1 +10.0 +7.2 +1.7 +10.1 +10.9 +16.3 +21.8 +22.6 +20.0 +17.4 +16.4 +12.1 +9.7 +3.6 +7.7 +8.5 +15.8 +16.3 +18.6 +21.8 +21.8 +19.3 +15.0 +9.8 +8.9 +8.8 +8.7 +10.7 +13.5 +18.0 +19.7 +20.0 +21.8 +18.8 +15.5 +9.9 +10.4 +9.5 +10.2 +12.9 +11.5 +21.0 +22.1 +25.8 +24.2 +20.7 +17.1 +10.9 +9.4 +10.2 +11.7 +13.6 +14.6 +20.5 +19.5 +24.7 +26.0 +19.7 +16.9 +10.7 +7.6 +7.3 +5.4 +12.5 +13.1 +15.7 +17.8 +23.2 +24.1 +21.4 +14.6 +10.6 +8.3 +7.5 +9.5 +11.8 +14.0 +21.0 +22.5 +22.5 +21.7 +18.9 +12.5 +12.0 +7.8 +10.3 +7.2 +11.8 +14.6 +18.0 +21.8 +21.6 +21.6 +17.5 +13.0 +8.8 +9.2 +9.3 +7.7 +12.3 +13.3 +16.0 +21.5 +26.2 +23.0 +17.8 +15.4 +13.6 +10.7 +8.9 +10.7 +11.2 +15.0 +19.0 +20.7 +26.3 +27.0 +19.2 +18.3 +12.0 +5.8 +7.2 +6.8 +8.6 +14.3 +15.1 +22.8 +24.2 +23.1 +19.2 +16.6 +10.5 +6.2 +5.5 +10.8 +13.8 +15.6 +18.7 +20.2 +23.5 +25.8 +20.9 +15.9 +12.5 +9.5 +9.2 +11.6 +12.1 +12.7 +19.6 +19.9 +21.4 +23.5 +20.4 +14.7 +9.6 +9.7 +9.4 +8.8 +12.2 +14.9 +19.1 +20.3 +24.9 +22.8 +21.3 +15.6 +11.3 +8.7 +8.6 +10.4 +12.1 +12.9 +18.0 +21.0 +21.0 +23.2 +20.1 +14.7 +11.0 +9.0 +7.1 +9.2 +9.5 +12.8 +18.8 +20.8 +24.3 +23.5 +18.1 +17.6 +11.3 +7.3 +9.5 +11.3 +12.4 +15.7 +17.3 +20.1 +22.3 +23.3 +20.3 +15.3 +12.4 +9.0 +8.0 +8.4 +13.6 +15.7 +18.2 +23.3 +24.2 +26.4 +21.9 +14.5 +12.6 +8.8 +8.8 +8.7 +10.8 +14.9 +18.2 +22.1 +22.7 +23.8 +20.8 +15.3 +11.2 +8.8 +9.5 +7.3 +11.5 +14.6 +17.7 +22.8 +23.3 +23.2 +21.4 +17.8 +10.7 +8.2 +7.6 +7.2 +9.4 +14.1 +18.0 +23.7 +28.2 +22.2 +22.7 +17.8 +12.7 +9.7 +10.5 +9.9 +12.5 +18.9 +17.9 +21.2 +21.4 +21.5 +19.9 +15.4 +11.4 +8.9 +10.4 +11.0 +10.6 +13.7 +19.8 +20.8 +22.8 +21.5 +18.5 +15.0 +10.7 +7.3 +6.8 +7.8 +12.9 +16.1 +19.1 +22.4 +23.0 +23.9 +20.5 +16.3 +12.6 +7.0 +4.5 +6.9 +11.1 +15.8 +17.3 +23.5 +25.0 +21.6 +19.4 +15.2 +9.1 +3.9 +7.4 +10.2 +12.3 +19.7 +19.4 +20.7 +21.7 +21.8 +21.3 +18.1 +13.6 +9.9 +9.8 +8.0 +14.7 +13.3 +18.2 +19.4 +21.3 +23.5 +20.0 +14.2 +11.0 +9.0 +6.5 +6.7 +6.9 +13.5 +16.4 +20.3 +27.0 +24.3 +19.7 +17.0 +10.4 +10.2 +10.0 +10.6 +14.1 +16.1 +18.0 +22.1 +25.8 +21.7 +21.5 +17.6 +12.5 +9.2 +8.8 +8.0 +11.6 +16.3 +17.6 +22.2 +23.7 +22.2 +18.6 +15.8 +13.4 +13.7 +9.5 +9.4 +10.7 +13.5 +19.0 +20.7 +24.0 +24.7 +22.4 +15.9 +10.5 +10.2 diff --git a/moby_01.txt b/moby_01.txt new file mode 100644 index 0000000..bcfbd95 --- /dev/null +++ b/moby_01.txt @@ -0,0 +1,26 @@ +Call me Ishmael. Some years ago--never mind how long precisely-- +having little or no money in my purse, and nothing particular +to interest me on shore, I thought I would sail about a little +and see the watery part of the world. It is a way I have +of driving off the spleen and regulating the circulation. +Whenever I find myself growing grim about the mouth; +whenever it is a damp, drizzly November in my soul; whenever I +find myself involuntarily pausing before coffin warehouses, +and bringing up the rear of every funeral I meet; +and especially whenever my hypos get such an upper hand of me, +that it requires a strong moral principle to prevent me from +deliberately stepping into the street, and methodically knocking +people's hats off--then, I account it high time to get to sea +as soon as I can. This is my substitute for pistol and ball. +With a philosophical flourish Cato throws himself upon his sword; +I quietly take to the ship. There is nothing surprising in this. +If they but knew it, almost all men in their degree, some time +or other, cherish very nearly the same feelings towards +the ocean with me. + +There now is your insular city of the Manhattoes, belted round by wharves +as Indian isles by coral reefs--commerce surrounds it with her surf. +Right and left, the streets take you waterward. Its extreme downtown +is the battery, where that noble mole is washed by waves, and cooled +by breezes, which a few hours previous were out of sight of land. +Look at the crowds of water-gazers there. diff --git a/moby_01_clean.txt b/moby_01_clean.txt new file mode 100644 index 0000000..d08880c --- /dev/null +++ b/moby_01_clean.txt @@ -0,0 +1,272 @@ +call +me +ishmael +some +years +ago +never +mind +how +long +precisely +having +little +or +no +money +in +my +purse +and +nothing +particular +to +interest +me +on +shore +i +thought +i +would +sail +about +a +little +and +see +the +watery +part +of +the +world +it +is +a +way +i +have +of +driving +off +the +spleen +and +regulating +the +circulation +whenever +i +find +myself +growing +grim +about +the +mouth +whenever +it +is +a +damp +drizzly +november +in +my +soul +whenever +i +find +myself +involuntarily +pausing +before +coffin +warehouses +and +bringing +up +the +rear +of +every +funeral +i +meet +and +especially +whenever +my +hypos +get +such +an +upper +hand +of +me +that +it +requires +a +strong +moral +principle +to +prevent +me +from +deliberately +stepping +into +the +street +and +methodically +knocking +people +s +hats +off +then +i +account +it +high +time +to +get +to +sea +as +soon +as +i +can +this +is +my +substitute +for +pistol +and +ball +with +a +philosophical +flourish +cato +throws +himself +upon +his +sword +i +quietly +take +to +the +ship +there +is +nothing +surprising +in +this +if +they +but +knew +it +almost +all +men +in +their +degree +some +time +or +other +cherish +very +nearly +the +same +feelings +towards +the +ocean +with +me +there +now +is +your +insular +city +of +the +manhattoes +belted +round +by +wharves +as +indian +isles +by +coral +reefs +commerce +surrounds +it +with +her +surf +right +and +left +the +streets +take +you +waterward +its +extreme +downtown +is +the +battery +where +that +noble +mole +is +washed +by +waves +and +cooled +by +breezes +which +a +few +hours +previous +were +out +of +sight +of +land +look +at +the +crowds +of +water +gazers +there \ No newline at end of file diff --git a/path.py b/path.py new file mode 100644 index 0000000..9b00744 --- /dev/null +++ b/path.py @@ -0,0 +1,55 @@ +# working with os + +import os +os.getcwd() # current working directory +os.curdir # constant, returns whatever string your system happens to use as the same directory indicator . or .. +os.listdir(os.curdir) # returns a list of filenames in the current working directory +os.listdir() # appends it to the path for the current working directory +os.chdir(folder name) # “Change directory” function, moves into that folder +os.name # constant returns the name of the Python module imported to handle the operating system: 'nt' for windows, 'posix' for linux +os.environ #All your environment variables and the values associated with them are available in a dictionary +os.rename('old name', 'new name') # To rename (move) a file or directory +os.remove() # Remove or delete a data file with +os.rmdir() # To remove an empty directory +os.mkdir() # create directory without any necessary intermediate directories +os.makedirs() # create directory with all necessary intermediate directories + +os.path.join() # construct pathnames by componants +os.path.split() # returns a two-element tuple splitting the basename of a path +os.path.basename() # returns only the basename of the path +os.path.dirname() # returns the path up to but not including the last name +os.path.splitext() # returns a tuple with separated file extention +os.path.commonprefix(path1, path2, ...) # finds the common prefix (if any) for a set of paths +os.path.expanduser() # expands username shortcuts in paths +os.path.expandvars() # expands environment variables +os.path.isdir(os.path.join(path, os.pardir, os.curdir)) # asks whether the parent of the parent of path is a directory + +os.path.exists() # returns True if its argument is a path corresponding tosomething that exists in the filesystem +os.path.isfile() # returns True if and only if the path it’s given indicates a normal data file of some sort +os.path.isdir() # returns True if and only if its path argument indicates a directory +os.path.islink() # Linux and other UNIX operating +os.path.ismount() # Linux and other UNIX operating +os.path.samefile(path1, path2) # returns True if and only if the two path arguments point to the same file +os.path.isabs(path) # returns True if its argument is an absolute path +os.path.getsize(path) # returns the size of a pathname +os.path.getmtime(path) # returns the last modify time of a pathname +os.path.getatime(path) # returns last access time of a pathname + +# working with pathlib +import pathlib +cur_path = pathlib.Path() +cur_path.cwd() + +from pathlib import Path +cur_path = Path() +cur_path.joinpath() +a_path = WindowsPath('bin/utils/disktools') +a_path.parts # returns a tuple of all the components of a path +a_path.name # returns only the basename of the path +a_path.parent # returns the path up to but not including the last name +a_path.suffix # dotted extension notation used by most filesystems to indicate file type +new_path = cur_path.joinpath('C:', 'my documents', 'tmp') +new_path.iterdir() # returns an iterator of paths +new_path.unlink() # Remove or delete a data file +new_path.mkdir(parents=True) # creates directory with any necessaryintermediate directories +new_path.rmdir() # To remove an empty directory \ No newline at end of file diff --git a/text_processor.py b/text_processor.py new file mode 100644 index 0000000..f06ff61 --- /dev/null +++ b/text_processor.py @@ -0,0 +1,49 @@ +'''the module for cleaning a text file, counting the words, and reporting frequent words''' + + +def remove_punc(string): + '''removing punctuations from any given string''' + table = string.maketrans('.,?;:!"-_][)(\'',' '*14) + return string.translate(table) + + + +def cleaner(text): + '''cleaning a file and making it standard to proccess''' + words_list = [] + for line in text: + lower_case = line.lower() + sans_punct = remove_punc(lower_case) + line_list = sans_punct.split() + words_list = words_list + line_list + return '\n'.join(words_list) + + +def w_counter(text): + '''counting words in any given text''' + counted = {} + for word in text: + counted[word] = counted.get(word, 0) + 1 + return counted + + +def most_finder(counted_dict): + '''inding most common words in a dictionary''' + global maxi + maxi = max(list(counted_dict.values())) + most = [] + for key in list(counted_dict.keys()): + if counted_dict[key] >= maxi - 7: + most.append(key.strip("\n")) + return most + + +def least_finder(counted_dict): + '''finding least common words in a dictionary''' + global mini + mini = min(list(counted_dict.values())) + least = [] + for key in list(counted_dict.keys()): + if counted_dict[key] == mini: + least.append(key.strip("\n")) + return least \ No newline at end of file