🧑 Mario Kahlhofer
📧 mario.kahlhofer@dynatrace.com
🌎 github.com/blu3r4y/python-for-java-developers
Python is a mature, general-purpose, object-oriented, dynamically-typed programming language.
Go to python.org and install the 64-bit version of Python 3.8 or newer.
🚫 Do NOT use Python 2.7 or older anymore!
python can be used from the command line directlypip is the most popular package manager for Python, pulling packages from pypi.orgThe most popular IDEs are IntelliJ PyCharm or Visual Studio Code.
If you intend to use lots of scientific packages, you can install Anaconda or Miniconda as an alternative. numpy / scipy / sympy / tensorflow / ... usually work out of the box with Anaconda, especially on Windows.
conda is the package manager used by Anaconda, pulling packages from anaconda.orgNotebooks let you mix code and documentation, usually for prototyping or documentation purposes.
Jupyter Notebooks are the "classic" notebooks and Jupyter Labs is the new IDE-like successor of them.
pip install jupyter jupyterlab # or, if that doesn't work python -m pip install jupyter jupyterlabYou may want to open *.ipynb notebook files directly within VS Code or PyCharm. Alternatively, you can start a stand-alone instance in the browser from the command line.
python -m juypter notebook [--notebook-dir <path>] python -m jupyter lab [--notebook-dir <path>]📜 ./python/m02_jupyter_introduction.ipynb
// ./java/M03_MaximumValue.java#L5-L15 List<Integer> numbers = Arrays.asList(1, -10, 0, -5, -1000, 100, 7); int maximum = numbers.get(0); for (int number : numbers) { if (number > maximum) { maximum = number; } } System.out.println("The maximum value is " + maximum);# ./python/m03_maximum_value.py numbers = [1, -10, 0, -5, -1000, 100, 7] maximum = numbers[0] for number in numbers: if number > maximum: maximum = number print("The maximum value is", maximum);{ } but blocks that are started by a colon :( ) around the expressions[ ]for and if syntax is slightly different#We will only look into a few non-container data types of Python, which Java would call primitive types. *
Find all "built-in types" at docs.python.org/3/library/stdtypes.html
💡 In Python, you do not specify types explicitly! Although, you can have type hints.
* You can think of a variable in Python as a "tag" or "name" that is attached to some object, and NOT as the "container" that holds some value. All types in Python are essentially objects, even the numeric, text, and boolean ones. However, don't wrap your head around this too much - as you will see, things turn out to behave quite similar to Java.
Unlike Java, you can re-assign values of different types to the same variable as you wish. **
x = 1416787301 x = "is" x = True** Speaking in the notion of "tags" and "names", this means that you can freely re-assign the "tag" or "name" to point to a different location.
There are only exist the three numeric types float / int / complex in Python.
float types in Python ➡ are equal to double types in Java *short / int / long / "float" / double types in Pythonmy_int = 5 my_float = 3.141 my_complex = 1 + 2j # there are also some useful ways to write numbers speed_of_light = 299_792_458 us_national_debt = 28.9e+12 ascii_symbol = 0x3f input_bitmask = 0b1011_1001* "Floating point numbers are usually implemented using double in C; information about the precision and internal representation of floating point numbers for the machine on which your program is running is available in sys.float_info" - see docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
Integers in Python allow computations beyond usual integer limits without loss of precision.
# ./python/m04_arbitrary_precision_integers.py lightyear_to_meter = 9_460_730_472_580_800 min_milky_way_diameter = 170_000 * lightyear_to_meter min_milky_way_diameter_plus_one = min_milky_way_diameter + 1 print("Woooooow, the milky way is at least", min_milky_way_diameter, "meters in diameter!") print("Adding one meter on that, we are at", min_milky_way_diameter_plus_one, "meters.") # > Woooooow, the milky way is at least 1608324180338736000000 meters in diameter! # > Adding one meter on that, we are at 1608324180338736000001 meters.Find them all at docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
# ./python/m04_mathematical_expressions.py x = 10.5 y = -3 print("x + y =", x + y) # addition print("x - y =", x - y) # subtraction print("x * y =", x * y) # multiplication print("x / y =", x / y) # normal division print("x // y =", x // y) # integer division print("x % y =", x % y) # modulo print("abs(y) =", abs(y)) print("int(x) =", int(x)) # convert to integer print("float(y) =", float(y)) # convert to float print("complex(x, y) =", complex(x, y)) # convert to complex print("pow(x, 3) =", pow(x, 3)) # exponentiation print("x ** 3 =", x ** 3) # exponentiation (alternative syntax)Find them all at docs.python.org/3/library/math.html
# ./python/m04_mathematical_functions.py # we use function from this built-in package import math print("sqrt(16) =", math.sqrt(16)) print("5! =", math.factorial(5)) print("log(e) =", math.log(math.e)) print("sin(pi / 2) =", math.sin(math.pi / 2))Strings in Python are immutable* - just like in Java. When you modify strings, new memory is allocated.
first_string = "Hello World" second_string = 'Hello Python' multi_line_strings = """This can even hold line breaks now"""* Immutable, i.e., unchangeable, objects can not be modified after their creation.
Many types in Python can be converted to a string with str() - similar to .toString() in Java.
As seen in the example, if you concatenate a string with a non-string, you even have to. **
// ./java/M04_StringConversion.java#L3-L4 int num = 42; System.out.println("The number is " + num);# ./python/m04_string_conversion.py num = 42 print("The number is " + str(num)) # alternative, which ONLY works for print() print("The number is", num) # print("The number is " + num) # 💥 TypeError: can only concatenate str (not "int") to strUse str.join() in Python to concatenate a large number of strings. *
// ./java/M04_StringConcatenation.java#L3-L8 String a = "How"; String b = "to"; String c = "concatenate"; String d = "strings"; String result = String.join(" ", a, b, c, d);# ./python/m04_string_concatenation.py#L1-L7 a = "How" b = "to" c = "concatenate" d = "strings" # we learn more about lists in the next modules ... result = " ".join([a, b, c, d])* The equivalent of a StringBuilder in Java would be io.StringIO in Python.
# ./python/m04_boolean_expressions.py x = True y = False print("x or y =", x or y) # logical or print("x and y =", x and y) # logical and print("not x =", not x) # logical notYou can also perform binary computations with bitwise operators.
Find them all at docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types
# ./python/m04_bitwise_expressions.py port = 0b1011_1011 bitmask = 0b0010_0000 is_bit_set = port & (bitmask >> 1) # we learn more about formatting in the next module ... print("dec:", is_bit_set) print(f"bin: {is_bit_set:08b}") # > dec: 16 # > bin: 00010000We will only look into a few collection types of Python.
Find them all at docs.python.org/3/library/stdtypes.html
list in Python (but, there is also tuple)dict in Pythonset in PythonLists hold multiple elements in a specific order. Unlike arrays, they can change in size at any time.
# ./python/m05_list_operations.py#L1-L15 numbers = [1, 2, 3, 4, 5] names = ["Janine", "Ali", "Alice"] mixed = [1, 2, "Max", 3.141] names[0] # get element by index names[0] = "Peter" # set element at index names[-1] # use negative indexes to count from the end names.append(-5) # add element to the end of the list names.insert(1, "Bob") # add element at specific index names.remove(-5) # remove the first occurrence from the list del names[0] # remove by indexLearn about all list operations at docs.python.org/3/tutorial/datastructures.html#more-on-lists.
# ./python/m05_list_operations.py#L18-L26 "Alice" in names # check for existence "Mario" not in names # ... and non-existence numbers.count(1) # the number of times this item is in the list len(numbers) # total number of elements in the list # merge two lists into one merged = [1, 2, 3] + [4, 5, 6]Tuples hold two or more objects together in an efficient manner. They have NO direct equivalent in Java. Use them to group together small number of elements, e.g., when returning multiple values from a method.
pair = ("Jonas", 12) # create a tuple pair[0] # get element by index, similar to lists💡 Tuples are always immutable!
You can NOT modify, append, or delete anything from them after you created one.
# pair[1] = 13 # 💥 TypeError: 'tuple' object does not support item assignment # pair.append(123) # 💥 AttributeError: 'tuple' object has no attribute 'append'However, you can convert tuples to lists.
numbers = (10, 11, 12) list(numbers) # and back again ... letters = ["A", "B", "C"] tuple(letters)Destructuring helps you to quickly retrieve elements from list-like types in Python.
# ./python/m05_destructuring.py x, y = 1, 2 print(x, y) # > 1 2 numbers = [1, 2, 3] x, y, z = numbers print(x, y, z) # > 1 2 3 pair = ("Jonas", 12) name, age = pair print(name, age) # > Jonas 12, in such contexts, a tuple is used implicitly.Dictionaries map keys to values.
# ./python/m05_dict_operations.py grades = { "math": 2, "programming": 1, "literature": 3 } # alternative syntax grades = dict(math=2, programming=1, literature=3) grades["math"] # get elements by key grades["math"] = 5 # set elements by key grades["electronics"] = 4 # add a new element # remove an element (will raise an error if the key does not exist) if "math" in grades: del grades["math"] grades.keys() # get all the keys as a list grades.values() # get all the values as a listSets hold multiple elements, without duplicates, but also without order.
# ./python/m05_set_operations.py#L1-L10 numbers = {1, 1, 2, 3, 5} # notice how the '1' is only appended once after all numbers.add(7) # add new elements numbers.add(1) # add elements that already exist (no effect) 1 in numbers # check for existence (much faster than with lists) # remove elements (will raise an error if the element does not exist) if 2 in numbers: numbers.remove(2)💡 You can NOT retrieve elements by index from a set!
# numbers[0] # 💥 TypeError: 'set' object is not subscriptableYou must iterate over them or convert the set to a list with list(elements)
# ./python/m05_set_operations.py#L12-L14 # iterate over set elements for val in numbers: print(val)Sets are handy when you want to apply operations from set theory.
# ./python/m05_set_arithmetic.py a = {1, 2, 3, 4, 5} b = {4, 5, 6, 7, 8} print("a | b =", a | b) # union print("a & b =", a & b) # intersection print("a - b =", a - b) # difference # > a | b = {1, 2, 3, 4, 5, 6, 7, 8} # > a & b = {4, 5} # > a - b = {1, 2, 3}You can read input from the command line with input()
# ./python/m06_input.py#L1-L2 name = input("Please enter your name: ") print("Your name is", name)💡 Don't forget data type conversions!
# ./python/m06_input.py#L4-L11 # this function will always give you a string number = input("Please enter a number: ") as_int = int(number) as_float = float(number) print(as_int, as_float)You output something to the command line with print()
# ./python/m06_output.py#L1-L14 pi = 3.141 print(pi) print() print("The value of pi is", pi) # > 3.141 # > # > The value of pi is 3.141 print("I hate: ", end="") print("line breaks") # > I hate: line breaksAmong many alternatives, format strings are the recommended way to format output.
# ./python/m06_output.py#L17-L19 print(f"The value of pi is {pi} and the value of tau is {2 * pi}") # > The value of pi is 3.141 and the value of tau is 6.282Look them up when you need it at gto76.github.io/python-cheatsheet/#format
# ./python/m06_number_formatting.py pi = 3.14159265359 print(pi) # > 3.14159265359 print(f"{pi:.0f}") # no decimal places print(f"{pi:.2f}") # two decimal places print(f"{pi:.3e}") # scientific notation # > 3 # > 3.14 # > 3.142e+00 ratio = 0.25 print(f"{ratio:.1%}") # percentage # > 25.0%Among many, here is one way to read and write a file in Python.
Learn more at docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files.
# ./python/m06_file_io.py#L3-L11 filename = "m06_file_io.txt" with open(filename, "w+") as f: f.write("Hello\n") f.write("File!\n") with open(filename, "r") as f: for line in f.read().splitlines(): print(line)r for reading - use w for writing, w+ for reading and writing *ascii, use the encoding="utf-8" keyword argument otherwise* Read about possible modes at gto76.github.io/python-cheatsheet/#open.
// ./java/M07_BasicControlFlow.java#L3-L17 int x = 0; switch (x) { case 0: System.out.println("The value is 0"); break; case 1: System.out.println("The value is 1"); break; case 2: System.out.println("The value is 2"); break; default: System.out.println("The value is something else"); }# ./python/m07_basic_control_flow.py x = 0 if x == 0: print("The value is 0") elif x == 1: print("The value is 1") elif x == 2: print("The value is 2") else: print("The value is something else")switch expression, you have to make a cascade of if / elif / else statements ** Actually, if you are using Python 3.10 or newer, there are the new match and case statements now.
// ./java/M07_SumOfAllDigits.java#L6-L18 Scanner scanner = new Scanner(System.in); System.out.print("Enter a number: "); int n = scanner.nextInt(); scanner.close(); int digitSum = 0; while (n > 0) { digitSum += n % 10; n = n / 10; } System.out.println("The digit sum is " + digitSum);# ./python/m07_sum_of_all_digits.py n = int(input('Enter a number: ')) digit_sum = 0 while n > 0: digit_sum += n % 10 n = n // 10 print("The digit sum is ", digit_sum)input() and can also output a promptwhile loop also exists in Python// in Python, but use a normal division / in Java# unlike Java, a division will alwasy give you a float data type assert 5 / 2 == 2.5 # unless you want an explicit integer division assert 5 // 2 == 2* assert will raise an AssertionError if the condition is False - use it to check assumptions in your code.
// ./java/M07_IteratingElementsByValue.java#L3-L7 String[] names = {"Lisa", "John", "Susan", "Alex"}; for (String name : names) { System.out.println(name); }# ./python/m07_iterating_elements_by_value.py names = ["Lisa", "John", "Susan", "Alex"] for name in names: print(name)// ./java/M07_IteratingElementsByIndex.java#L3-L7 int[] numbers = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; for (int i = 5; i < 8; i++) { System.out.println(numbers[i]); }# ./python/m07_iterating_elements_by_index.py numbers = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] for i in range(5, 8): print(numbers[i])x in y syntax with a for looprange(start, stop),start to stop - 1💡 Actually, range() will give you an iterator!
If you really want the numbers in a list, you have to convert the result.
# iterators only allow getting the next element with next() range(5, 8) # lists allow arbitrary access by index list(range(5, 8))Examples like the one before are usually solved by slicing list-like collections.
This is also very useful for mathematical applications, e.g. when working with a lot of arrays and matrices.
# ./python/m07_sequence_slicing.py#L1-L5 numbers = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] numbers[5:8] # give me a new COPY of the list, starting at index 5, and ending at index 7 # > [15, 16, 17]The following variants are supported:
a[start:stop:step]a[start:stop]a[start:]a[:stop]a[:]The stop index is always exclusive, i.e. the element at index stop is not part of the resulting slice.
numbers = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]# ./python/m07_sequence_slicing.py#L7-L14 numbers[1:] # all except the 1st item > [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] numbers[:3] # the first three items > [10, 11, 12] numbers[:-1] # all except the last item > [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] numbers[-2:] # the last two items > [19, 20] numbers[::2] # every 2nd item > [10, 12, 14, 16, 18, 20] numbers[1::2] # every 2nd, but start at 2 > [11, 13, 15, 17, 19]This also works with strings because they are just a list of characters.
# ./python/m07_sequence_slicing.py#L17-L20 name = "Hello World" name[1:-1] # > 'ello Worl'reversed(a) to iterate over the sequence in reverse ordera.reverse() on the object to reverse the items in-placea[::-1]# ./python/m07_sequence_reversing.py numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # iterator that iterates the list in reverse order reversed(numbers) # reverse the list in-place numbers.reverse() # slice a reversed copy of the elements numbers[::-1]sorted(a) to get a sorted list of the elementsa.sort() to sort the sequence in-placereverse=True keyword argument to reverse the sorting order# ./python/m07_sequence_sorting.py numbers = [1, -10, 20, 11, 19, 0, -5, -1000, 100, 7] # get a sorted list of the elements sorted(numbers) sorted(numbers, reverse=True) # sort the list in-place numbers.sort() numbers.sort(reverse=True)// ./java/M07_EnumeratingOverElements.java#L3-L9 String[] names = {"Lisa", "John", "Susan", "Alex"}; int i = 0; while (i < names.length) { System.out.println(i + " " + names[i]); i++; }# ./python/m07_enumerating_over_elements.py names = ["Lisa", "John", "Susan", "Alex"] for i, name in enumerate(names): print(i, name)enumerate() creates tuples for us here// ./java/M07_PriceTax.java#L5-L16 List<Double> prices = Arrays.asList(12.3, 5.2, 8.7, 1.2, 8.0); List<Double> gross = new ArrayList<Double>(); for (double price : prices) { if (price > 8) { gross.add(price * 1.2); } } for (double price : gross) { System.out.println(price); }# ./python/m07_price_tax.py#L1-L8 prices = [12.3, 5.2, 8.7, 1.2, 8.0] gross = [] for price in prices: if price > 8: gross.append(price * 1.2) print(gross)List comprehensions map each value in a list to a new value and thus create a new list. *
[x for x in sequence]
# ./python/m07_price_tax.py#L11-L12 prices = [12.3, 5.2, 8.7, 1.2, 8.0] gross = [price * 1.2 for price in prices if price > 8]* Python offers a lot of features for functional programming, like map / filter / reduce / zip / all / any / ...
// ./java/M08_RectangleFunctions.java#L2-L16 static double area(double a, double b) { return a * b; } static boolean isSquare(double a, double b) { return a == b; } public static void main(String[] args) { System.out.println("area(1, 5) = " + area(1, 5)); System.out.println("area(1.5, 2.3) = " + area(1.5, 2.3)); System.out.println("isSquare(1, 5) = " + isSquare(1, 5)); System.out.println("isSquare(5, 5) = " + isSquare(5, 5)); }# ./python/m08_rectangle_functions.py#L1-L13 def area(a, b): return a * b def is_square(a, b): return a == b print("area(1, 5) =", area(1, 5)) print("area(1.5, 2.3) =", area(1.5, 2.3)) print("is_square(1, 5) =", is_square(1, 5)) print("is_square(5, 5) =", is_square(5, 5))defstatic keywordIn a nutshell, Python has the same passing behavior as Java - although, Python lacks primitive types.
// ./java/M08_PassByObjectReference.java#L4-L20 static void replace(List<Integer> numbers) { numbers = Arrays.asList(42, 43, 44); } static void append(List<Integer> numbers) { numbers.add(42); } public static void main(String[] args) { List<Integer> oneTwoThree = new LinkedList<>(Arrays.asList(1, 2, 3)); replace(oneTwoThree); System.out.println(Arrays.toString(oneTwoThree.toArray())); append(oneTwoThree); System.out.println(Arrays.toString(oneTwoThree.toArray())); }# ./python/m08_pass_by_object_reference.py def replace(numbers): numbers = [42, 43, 44] def append(numbers): numbers.append(42) one_two_three = [1, 2, 3] replace(one_two_three) print(one_two_three) # > [1, 2, 3] append(one_two_three) print(one_two_three) # > [1, 2, 3, 42]Arguments are ALWAYS passed by-value, in Java and also in Python.
When your argument is an object, the reference to that object is passed.
int, the value is copied.int, the object reference is passed and NO data is copied.int is immutable, you can't change the value of the original object either. ** From here on, things get complicated. Learn more about the technical details by Robert Heaton. 2014. "Is Python pass-by-reference or pass-by-value?"
and Sreejith Kesavan. 2012. "Understanding Python Variables and Memory Management".
You can specify argument names explicitly - and even change their order.
# ./python/m08_rectangle_functions.py#L17-L18 area(a=2, b=5) area(b=5, a=2)You can specify default values for arguments.
# ./python/m08_function_differences.py#L1-L12 def function_with_default_args(x, y, name="Unknown User", factor=1.2): result = x * y * factor print(f"Hello {name}, your result is {result}") function_with_default_args(1, 2) function_with_default_args(1, 2, name="Mario") function_with_default_args(1, 2, factor=10) # > Hello Unknown User, your result is 2.4 # > Hello Mario, your result is 2.4 # > Hello Unknown User, your result is 20You can return multiple results with tuples and destructuring.
# ./python/m08_function_differences.py#L15-L30 def function_with_two_return_values(radius): pi = 3.14159 circumference = 2 * pi * radius area = pi * radius ** 2 return circumference, area c, a = function_with_two_return_values(5) print("circumference", c) print("area", a) # > circumference 31.4159 # > area 78.53975*args and **kwargs to work with almost arbitrary input parameters, which you already did use in the print() function for exampleLearn more about funtions at docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions.
Python is object-oriented, but follows a more lean approach towards classes.
// ./java/M09_PassengersProgram.java#L3-L40 class Passenger { final String firstName; final String lastName; Passenger(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } void display() { System.out.printf("%s %s %n", firstName, lastName); } static Passenger fromInput() { Scanner scanner = new Scanner(System.in); System.out.print("Enter first name: "); String firstName = scanner.nextLine(); System.out.print("Enter last name: "); String lastName = scanner.nextLine(); scanner.close(); return new Passenger(firstName, lastName); } } class PassengersProgram { public static void main(String[] args) { Passenger lisa = new Passenger("Lisa", "Ha"); Passenger user = Passenger.fromInput(); lisa.display(); user.display(); } }# ./python/m09_passengers_program.py class Passenger: def __init__(self, first_name, last_name): self.first_name = first_name self.last_name = last_name def display(self): print(f"Passenger: {self.first_name} {self.last_name}") @staticmethod def from_input(): first_name = input("Enter first name: ") last_name = input("Enter last name: ") return Passenger(first_name, last_name) if __name__ == "__main__": lisa = Passenger("Lisa", "Ha") user = Passenger.from_input() lisa.display() user.display()__init__ with a mandatory self parameterfirst_name and last_name,self parameterself. if you want to access class propertiesfinal in Python@staticmethod decorator and omits the self parameternew keywordmain method in Python is actually a condition - we will learn more in the next modules// ./java/M09_ShapesProgram.java interface Shape { double area(); } class Circle implements Shape { final double radius; Circle(double radius) { this.radius = radius; } @Override public double area() { return 3.14159 * radius * radius; } } class Square implements Shape { final double length; Square(double length) { this.length = length; } @Override public double area() { return length * length; } } class ShapesProgram { public static void main(String[] args) { Shape[] shapes = { new Circle(5), new Square(10) }; for (Shape shape : shapes) { System.out.println(shape.area()); } } }# ./python/m09_shapes_program.py class Shape: def area(self): pass class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius * self.radius class Square(Shape): def __init__(self, length): self.length = length def area(self): return self.length * self.length shapes = [Circle(5), Square(10)] for shape in shapes: print(shape.area())interface type in Python, instead we use a normal class and inhert from itShape or renaming the area() method ...Since there is NO type-checking at compile-time, we may also solely rely on duck-typing.
An AttributeError is thrown at runtime, if the method you are calling wouldn't exist. *
# ./python/m09_shapes_duck_typing.py class Circle: def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius * self.radius class Square: def __init__(self, length): self.length = length def area(self): return self.length * self.length shapes = [Circle(5), Square(10)] for shape in shapes: print(shape.area())abc module* Look into type hints to have better type-checking at runtime and even before you run your code.
Let's take a quick interactive look at how one would create a Python project consisting of multiple files.
📜 ./python/m10_multiple_scripts
📜 ./python/m10_demo_project
Learn about more best practices at docs.python-guide.org/writing/structure
Your code is always executed from top to bottom.
python script.pyThe __main__ condition that you write, will only evaluate to True when that script is executed directly.
# ./python/m10_multiple_scripts/main.py#L5-L6 if __name__ == "__main__": print("This will only run if you specifically started the interpretor on this file.")With that, you mainly differentiate if a script is run directly, or being imported.
Upon import, the __main__ condition of the importee will evaluate to False.
# ./python/m10_multiple_scripts/imports.py import main # you might also want to try out these: # import script # from main import test_variable if __name__ == "__main__": print("The value of the test variable is:", main.test_variable)You should structure your code into packages ("directories") and modules ("Python files").
. ├── README.md <-- brief description ├── requirements.txt <-- list of dependencies (list package names and versions) ├── graphics │ ├── __init__.py │ └── parabola.py └── user <-- a package named 'user' ├── __init__.py <-- will be executed when you 'import user' └── app.py <-- a module named 'app' Dependencies are usually listed in a requirements.txt file and are installed with pip. *
python -m pip install -r requirements.txtYou run modules when your code consists of multiple files.
python -m user.appWhen you run a module, your root package is loaded into the import path of the interpreter.
Thus, on each import statement you write, packages and modules will be found and imported.
* Note that pip is a package by itself and that we use the module mode to run it. Many modules are also added to your system path upon installation, which allows you to run them directly from the command line, e.g. with pip instead of python -m pip.
Don't re-invent the wheel for various tasks, have a look at what packages exist already.
numpy & scipy - high-performance numerical computations, multi-dimensional arraysmatplotlib & seaborn & plotly & bokeh - graphical visualization for mathematicianspandas - work with tabular datasympy - symbolic mathematicsnetworkx - graphs and networksrequests - network requests, download filestkinter & pyqt - graphical user interfaces💡 Install new packages with pip
python -m pip install <package-name>numpy and matplotlib# ./python/m11_numpy_demo.py import matplotlib.pyplot as plt import numpy as np # get 1000 numbers between -5 and 5 xs = np.linspace(-5, 5, 1000) # apply a function on this numpy array ys = xs ** 2 - 1 # show a figure plt.plot(xs, ys) plt.show()pandas# ./python/m11_pandas_demo.py import pandas as pd # quickly read a csv file df = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data") print(df)If you ever need help, type help - use the resources mentioned in the beginning - or, ask Google.
help(sorted) # > Help on built-in function sorted in module builtins: # > # > sorted(iterable, /, *, key=None, reverse=False) # > Return a new list containing all items from the iterable in ascending order. # > # > A custom key function can be supplied to customize the sort order, and the # > reverse flag can be set to request the result in descending order.Never forget the Zen of Python.
import thisAnd also try out this one.
import antigravity