# Python Basics ###### tags: `Python` [cheatsheet](https://www.programiz.com/python-programming/keyword-list) ## Expression & Variables ### Data Types - String - Float - Integer - Booleank ```python print("Sting") #String print(7 + 8) #15 print(7 + "8") #TypeError # 使用 type() 查詢 data types print(type("a")) #<class 'str'> print(type(2)) #<class 'int'> print(type(2.5)) #<class 'float'> ``` ### String below are string method - string indexing ```python name = "Jalen" print(name[1] # a print(name[0]) # J # check the position of the elements in a string name.index("l") # 2 pets = "Cats & Dogs" pets.index("Dog") # 7 pets.index("s") # 3,雖然有兩個s,只會返回第一個 s 的所在位置 # check if the element is in a string "Dragons" in pets. #因為 pets 內沒有 Dragon,顯示 False ``` - slice ```python fruit = "Pineapple" print(fruit[:4]) #Pine print(friut[4:]) #apple ``` - create new string ```python message = "A kong string with a silly typo" message[2] = "l" #error, 因為 string is immutable,需用以下方式 new_message = message[0:2] + "l" + mssage[3:] #correct, result: A long string with a silly typo ``` - upper and lower ```python "Mountains".upper() #MOUNTAINS "Mountains".lower() #mountains ``` - strip 篩除空格/lstrip 刪除左方空格/rstrip 刪除右方空格 ```python " yes ".strip() #'yes' " yes ".lstrip() #'yes ' " yes ".rstrip() #' yes' ``` - count 計算字串內的字母數量 ```pyton "The number of times e occurs in this string is 4".count("e") #result: 4 ``` - endswith 檢查 String 的結尾 ```python "Forest".endswith("rest") #True ``` - isnumeric 檢查 string 是否都是數字 ```python "Forest".isnumeric() #False "12345".isnumeric() #True ``` - int 將 string 轉換成數字 ```python int('12345') + int('54321') # 66666 # 因為 12345 + 54321 = 66666 ``` - join 插入 ```python " ".join(["This", "is", "test."]) # This is test. "......".join(["This", "is". "test."]) # This......is......test. ``` - split 分割 ```python "This is another example".split() #['This', 'is', 'another', 'example'] ``` **formatting strings** 比 `str()` 更好用的 string 轉換器 ```python name = "Manny" number = leng(name) * 3 print("Hello {}, your lucky number is {}".format(name, number)) # Hello Manny, your lucky number is 15 # formatting example: set the position in {} print("Your lucky number is {number}, {name}.".format(name=name, number=len(name)*3)) # Your lucky number is 15. Manny. #formatting expression price = 7.5 with_tax = price * 1.09 print(price, with_tax) #7.5 8.175 print("Base price: ${:.2f}. With Tax: ${:.2f}".format(price, with_tax)) # Base price: $7.50. With Tax: $8.18 # 表示改為 float 且四捨五入顯示兩位數 ``` ![](https://i.imgur.com/10dUqUl.png) #### EXAMPLES of String ```python= #EXAMPLE 1 def double_word(word): length = len(word*2) return word*2 + str(length) print(double_word("hello")) # Should return hellohello10 print(double_word("abc")) # Should return abcabc6 print(double_word("")) # Should return 0 #EXAMPLE 2 def first_and_last(message): if message == "" or message[0] == message[-1]: return True return False print(first_and_last("else")) print(first_and_last("tree")) print(first_and_last("")) #result: 如果第一個字母與最後一個字母相同/“”,回傳 True, 否則回傳 False #EXAMPLE 3: 替換email,以新domain取代舊domain def replace_domain(email, old_domain, new_domain): if "@" + old_domain in email: index = email.index("@" + old_domain) new_email = email[:index] + "@" + new_domain return new_email return email #EXAMPLE 4 def initials(phrase): words = phrase.split() result = "" for word in words: result += word[0].upper() return result print(initials("Universal Serial Bus")) # Should be: USB print(initials("local area network")) # Should be: LAN print(initials("Operating system")) # Should be: OS #EXAMPLE 5 def to_celsius(x): return (x-32)*5/9 for x in range(0, 101, 10): print("{:>3} F | {:>6.2f} C".format(x, to_celsius(x))) #result # 0 F | -17.78 C # 10 F | -12.22 C # 20 F | -6.67 C # 30 F | -1.11 C # 40 F | 4.44 C # 50 F | 10.00 C # 60 F | 15.56 C # 70 F | 21.11 C # 80 F | 26.67 C # 90 F | 32.22 C # 100 F | 37.78 C #EXAMPLE 6: 互文 def is_palindrome(input_string): # We'll create two strings, to compare them new_string = "" reverse_string = "" # Traverse through each letter of the input string for x in input_string.upper(): # Add any non-blank letters to the # end of one string, and to the front # of the other string. if x != " ": new_string = new_string + x reverse_string = x + reverse_string # Compare the strings if new_string == reverse_string: return True return False print(is_palindrome("Never Odd or Even")) # Should be True print(is_palindrome("abc")) # Should be False print(is_palindrome("kayak")) # Should be True #EXAMPLE 7 def pig_latin(text): say = "" # Separate the text into words words = text.split() a = [] for word in words: # Create the pig latin word and add it to the list say = word[1:]+ word[0] + "ay" a.append(say) # Turn the list back into a phrase return " ".join(a) print(pig_latin("hello how are you")) # Should be "ellohay owhay reaay ouyay" print(pig_latin("programming in python is fun")) # Should be "rogrammingpay niay ythonpay siay unfay" ``` ### Lists & Tuples `x = ["Now", "we", "are"]` - check the list length :point_right: `len(x)` - check if the element is in the list :point_right: `"are" in x` - check the spesific position in the list :point_right: `print(x[0])` - List 與 String 同屬於sequence,都能使用 - for elemrnt in sequence - sequence[x] - len(sequence) - sequence + sequence - element in sequence - lists 與 string 的不同點在於:lists is mutable(能直接在list內更改element) - `enumerate` ```python winners = ["Ashley", "Dylan", "Reese"] for index, person in enumerate(winners): print("{} - {}".formate(index+1, person)) # 1 - Ashley # 2 - Dylan # 3 - Reese ``` - list comprehension ```python multiple = [] for x in range(1, 11): multiples.append(x*7) print(multiples) #[7, 14, 21, 28, 35, 42, 49, 56, 63, 70] #list comprehension can do it in one-line multiples = [x*7 for x in range(1, 11)] print(multiples) #[7, 14, 21, 28, 35, 42, 49, 56, 63, 70] languages = ["Python", "Perl", "Ruby", "Go"] lengths = [len(language) for langue in langues] print(lengths) # [6, 4, 4, 2] # 從 1-100 中找出 3 的倍數 z = [x for x in range(0, 101) if x % 3 == 0] print(z) #[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] ``` ```python x = ["Now", "we", "are"] len(x) #3 "are" in x #True x[0] #'Now' x[1:3] #['We', 'are'] x[:2] #['Now', 'we'] x[2:] #['are'] ``` #### Modify The Content Of A List - `.append("element")` - `.insert(index, "element")` - `.remove("element")` - `.pop(index)` ```python fruits = ["pineapple", "banana", "apple", "melon"] friuts.append("kiwi") # fruits = ["pineapple", "banana", "apple", "melon", "kiwi"] fruits.insert(0, "orange") # fruits = ["orange", "pineapple", "banana", "apple", "melon", "kiwi"] #即使 insert 的位置超過 lists 也能用 friuts.insert(100, "grape") # fruits = ["orange", "pineapple", "banana", "apple", "melon", "kiwi", "grape"] fruites.remove("melon") # fruits = ["orange", "pineapple", "banana", "apple", "kiwi", "grape"] fruites.pop(3) # 原本的 fruits = ["orange", "pineapple", "banana", "apple", "kiwi", "grape"] # 第 3 個位置的元素會被拿掉 # fruits = ["orange", "pineapple", "banana", "kiwi", "grape"] fruites[2] = "strawberry" # 原本的 fruits = ["orange", "pineapple", "banana", "kiwi", "grape"] # 第 2 個位置會被 strawberry 取代 # fruits = ["orange", "pineapple", "strawberry", "kiwi", "grape"] ``` #### Lists And Tuples Tuple 的特色 - 順序性 - elements 可以是任何資料型態 - immutable,不可改變 - tuple 的「位置順序」是有意義的 - `fruits = ['apple', 'pineapple', 'melon']` 是 string - `fruits = ('apple', 'pineapple', 'melon')` 是 tuple - 使用 unpack 方式分割 tuple ```python def convert_seconds(seconds): hours = seconds // 3600 minutes = (seconds - hours * 3600)//60 remaining_seconds = seconds - hours * 3600 - minutes * 60 return hours, minutes, remaining_seconds result = convert_seconds(5000) type(result) #<class 'tuple'> print(result) # (1, 23, 20) # 以 unpack 方式分割 tuple hours, minutes, seconds = result print(hours, minutes, seconds) # 1 23 20 ``` #### EXAMPLES of Lists & Tuple ```python= #EXAMPLE 1 def group_list(group, users): members = ",".join(users) return group + ": " + members print(group_list("Marketing", ["Mike", "Karen", "Jake", "Tasha"])) # Should be "Marketing: Mike, Karen, Jake, Tasha" print(group_list("Engineering", ["Kim", "Jay", "Tom"])) # Should be "Engineering: Kim, Jay, Tom" print(group_list("Users", "")) # Should be "Users:" #EXAMPLE 2: lisrs 間隔列印 def skip_elements(elements): # code goes here new_elements = [] length = len(elements) for i in range(0, length, 2): new_elements.append(elements[i]) return new_elements print(skip_elements(["a", "b", "c", "d", "e", "f", "g"])) # Should be ['a', 'c', 'e', 'g'] print(skip_elements(['Orange', 'Pineapple', 'Strawberry', 'Kiwi', 'Peach'])) # Should be ['Orange', 'Strawberry', 'Peach'] print(skip_elements([])) # Should be [] #EXAMPLE 3 unpack tuple #guest_list(('Ken', 30, "Chef"), ("Pat", 35, 'Lawyer'), ('Amanda', 25, "Engineer")) def guest_list(guests): for guest in guests: name, age, role = guest print("{name} is {age} years old and works as {role}".format(name=name, age=age, role=role)) #guest_list([('Ken', 30, "Chef"), ("Pat", 35, 'Lawyer'), ('Amanda', 25, "Engineer")]) #EXAMPLE 4: List's enumerate def skip_elements(elements): new_elements = [] for index, element in enumerate(elements): if index % 2 == 0: new_elements.append(element) return new_elements print(skip_elements(["a", "b", "c", "d", "e", "f", "g"])) # Should be ['a', 'c', 'e', 'g'] print(skip_elements(['Orange', 'Pineapple', 'Strawberry', 'Kiwi', 'Peach'])) # Should be ['Orange', 'Strawberry', 'Peach'] #EXAMPLE 5: enter a bunch of email and name as a list def full_emails(people): result = [] for email, name in people: result.append("{} <{}>".formate(name, email)) return result print(full_emails(['tcmiss@gmail.com', 'TC Huang'], ['brian@gmail.com', 'Brian Wu'])) #['TC Huang <tcmiss@gamil.com>', 'Brian Wu <brian@gmail.com>'] #EXAMPLE 6 def skip_elements(elements): return [element for element in elements if elements.index(element) % 2 == 0] print(skip_elements(["a", "b", "c", "d", "e", "f", "g"])) # Should be ['a', 'c', 'e', 'g'] print(skip_elements(['Orange', 'Pineapple', 'Strawberry', 'Kiwi', 'Peach'])) # Should be ['Orange', 'Strawberry', 'Peach'] ``` :::info :bulb:**[Common sequence operations](https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range)** - len(sequence) Returns the length of the sequence - for element in sequence Iterates over each element in the sequence - if element in sequence Checks whether the element is part of the sequence - sequence[i] Accesses the element at index i of the sequence, starting at zero - sequence[i:j] Accesses a slice starting at index i, ending at index j-1. If i is omitted, it's 0 by default. If j is omitted, it's len(sequence) by default. - for index, element in enumerate(sequence) Iterates over both the indexes and the elements in the sequence at the same time --- :bulb:**List-specific operations and methods** - list[i] = x Replaces the element at index i with x - list.append(x) Inserts x at the end of the list - list.insert(i, x) Inserts x at index i - list.pop(i) Returns the element a index i, also removing it from the list. If i is omitted, the last element is returned and removed. - list.remove(x) Removes the first occurrence of x in the list - list.sort() Sorts the items in the list - list.reverse() Reverses the order of items of the list - list.clear() Removes all the items of the list - list.copy() Creates a copy of the list - list.extend(other_list) Appends all the elements of other_list at the end of lis --- :bulb:**List comprehension** - [expression for variable in sequence] Creates a new list based on the given sequence. Each element is the result of the given expression. - [expression for variable in sequence if condition] Creates a new list based on the given sequence. Each element is the result of the given expression; elements only get added if the condition is true. ::: --- ### [Dictionaries](https://docs.python.org/3/library/stdtypes.html#mapping-types-dict) `x = {"key":value, "key2":value2}` #### Operations - len(dictionary) - Returns the number of items in the dictionary - for key in dictionary - Iterates over each key in the dictionary - for key, value in dictionary.items() - Iterates over each key,value pair in the dictionary - if key in dictionary - Checks whether the key is in the dictionary - dictionary[key] - Accesses the item with key key of the dictionary - dictionary[key] = value - Sets the value associated with key - del dictionary[key] - Removes the item with key key from the dictionary #### Methods - dict.get(key, default) - Returns the element corresponding to key, or default if it's not present - dict.keys() - Returns a sequence containing the keys in the dictionary - dict.values() - Returns a sequence containing the values in the dictionary - dict.update(other_dictionary) - Updates the dictionary with the items coming from the other dictionary. - Existing entries will be replaced; new entries will be added. - dict.clear() - Removes all the items of the dictionary ```python files = {"jpg": 10, "csv": 25} files["jpg"] # 結果是 10 "jpg" in files # 結果是 True,因為 file 內有 jpg ``` #### Dictionaries is mutable 更改 ```python toc = {"Introduction":1, "Chapter 1":4, "Chapter 2":11, "Chapter 3":25, "Chapter 4":30} toc["Chapter 5"] = 50 # 新增 Chapter 5 del toc["Chapter 4"] # 刪除 Chapter 4 ``` ```python= # EXAMPLE 1 cool_beasts = {"octopuses":"tentacles", "dolphins":"fins", "rhinos":"horns"} for key, value in cool_beasts.items(): print("{} have {}".format(key, value)) #result # octopuses have tentacles # dolphins have fins # rhinos have horns #EXAMPLE 2 wardrobe = {"shirt":["red","blue","white"], "jeans":["blue","black"]} for item, color in wardrobe.items(): for color in color: print("{} {}".format(color, item)) # result # red shirt # blue shirt # white shirt # blue jeans # black jeans #EXAMPLE 3 def email_list(domains): emails = [] for mail, users in domains.items(): for user in users: emails.append(user + "@" + mail) return(emails) print(email_list({"gmail.com": ["clark.kent", "diana.prince", "peter.parker"], "yahoo.com": ["barbara.gordon", "jean.grey"], "hotmail.com": ["bruce.wayne"]})) #result # ['clark.kent@gmail.com', 'diana.prince@gmail.com', 'peter.parker@gmail.com', 'barbara.gordon@yahoo.com', 'jean.grey@yahoo.com', 'bruce.wayne@hotmail.com'] #EXAMPLE 4 def groups_per_user(group_dictionary): user_groups = {} # Go through group_dictionary for groups, users in group_dictionary.items(): # Now go through the users in the group for user in users: ### Now add the group to the the list of ### groups for this user, creating the entry ### in the dictionary if necessary # if user is exist in user_goups, append to # the list. At first it does not exist so # it goes else part. if user in user_groups: user_groups[user].append(groups) # if user not exist it is create the firts # key:value pair. else: user_groups[user] = [groups] return(user_groups) print(groups_per_user({"local": ["admin", "userA"], "public": ["admin", "userB"], "administrator": ["admin"] })) #result # {'admin': ['local', 'public', 'administrator'], 'userA': ['local'], 'userB': ['public']} #EXAMPLE 5 def combine_guests(guests1, guests2): # Combine both dictionaries into one, with each key listed # only once, and the value from guests1 taking precedence guests2.update(guests1) return guests2 Rorys_guests = { "Adam":2, "Brenda":3, "David":1, "Jose":3, "Charlotte":2, "Terry":1, "Robert":4} Taylors_guests = { "David":4, "Nancy":1, "Robert":2, "Adam":1, "Samantha":3, "Chris":5} print(combine_guests(Rorys_guests, Taylors_guests)) #result # {'David': 1, 'Nancy': 1, 'Robert': 4, 'Adam': 2, 'Samantha': 3, 'Chris': 5, 'Brenda': 3, 'Jose': 3, 'Charlotte': 2, 'Terry': 1} ``` --- ### Variables ```python length = 10 width = 2 area = length * width print(area) ``` - length, width, area are variables - assignment - expression - variable 命名限制 - 不能使用 Python 內建的關鍵字或 function 名稱 - 不能使用空白格 - 必須以`字母`或`_`當開頭 - 只能以 `字母`、`_` 與 `數字` 組成變數名稱 ### Type Conversion - implicit conversion ```python print("I " + "like " + "Python.") ``` - explicit conversion ```python base = 6 height = 3 area = (base*height)/2 print("The area of the triangle is: " + str(area)) # str()將數字轉換成 string ``` ## Function - function name = greeting - paremeter = name - body(action) ```python def greeting(name): print("Welcome, " + name) ``` ### Value - return value ```python def area(base, height): return base*height/2 # 這種寫法可以儲存變數 #> area_a = area(5, 4) #> area_b = area(7, 3) #> sum = area_a + area_b #> print("Sum of both areas is " + str(sum)) ``` - call value ```python def greeting(name): print("welcome, " + name) # 給予變數就能 call value result = greeting("Christine") # call 一次後再 print 會顯示 none,表示 return nothing ``` ### Condition ```python # This function compares two numbers and returns them # in increasing order. def order_numbers(number1, number2): if number2 > number1: return number1, number2 else: return number2, number1 # 1) Fill in the blanks so the print statement displays the result # of the function call smaller, bigger = order_numbers(100, 99) # 變數的順序沒差 print(smaller, bigger) #> 99 100 ``` **練習題* ```python def calculate_storage(filesize): block_size = 4096 # Use floor division to calculate how many blocks are fully occupied full_blocks = filesize // block_size # Use the modulo operator to check whether there's any remainder partial_block_remainder = filesize % block_size # Depending on whether there's a remainder or not, return the right number. if partial_block_remainder > 0: return block_size*(full_blocks+1) return block_size print(calculate_storage(1)) # Should be 4096 print(calculate_storage(4096)) # Should be 4096 print(calculate_storage(4097)) # Should be 8192 print(calculate_storage(6000)) # Should be 8192 ``` ## Loops ### While Loops > 寫 Loop 該注意的事項 > 1. 確認variables 是否都被定義了 > 2. 確認是否有 break 的條件 > ```python x = 0 while x < 5: print("Not yet, the number is " + str(x)) x = x + 1 print("x = " + str(x)) # EXAMPLE 1 def attempts(n): x = 1 while x <= n: print("Attempt " + str(x)) x += 1 print("Done") attempts(5) #>Attepmt 1 #>Attepmt 2 #>Attepmt 3 #>Attepmt 4 #>Attepmt 5 #>Done # EXAMPLE 2 def digits(n): count = 0 if n == 0: count = 1 while (n >= 1): count += 1 n = n/10 return count print(digits(25)) # Should print 2 print(digits(144)) # Should print 3 print(digits(1000)) # Should print 4 print(digits(0)) # Should print 1 #result # 2 # 3 # 4 # 1 ``` **common errors in Loops: initialize the variables** > 忘了先定義 variable > ```python # 錯誤寫法 def count_down(start_number): while (current > 0): print(current) current -= 1 print("Zero!") count_down(3) # 正確寫法:有 initialize variable def count_down(start_number): current = start_number # 在這裡 initialize 'current' 這個變數為 'start_number' while (current > 0): print(current) current -= 1 print("Zero!") count_down(3) ``` **以 Loop 做質因數分解** > 以下程式能找出組成 number 的所有質因數。 > 例如:number = 100,其質因數是 2, 2, 5, 5,因為 2x2x5x5 = 100。 > ```python def print_prime_factors(number): # Start with two, which is the first prime factor = 2 # Keep going until the factor is larger than the number while factor <= number: # Check if factor is a divisor of number if number % factor == 0: # If it is, print it and divide the original number print(factor) number = number / factor else: # If it's not, increment the factor by one factor += 1 return "Done" print_prime_factors(100) # Should print 2,2,5,5 ``` **n 是否為 2 的次方?** - 檢查 n 是否能被 2 整除 - 若能被 2 整除 - 讓 n 再除以 2(排除 6, 10 等非 2 次方數字) - 若 n 除以 2 之後的數字,能被 2 整除,且 n 不等於 0 - 返回 True - 否則返回 False ```python def is_power_of_two(n): while n % 2 == 0: n = n / 2 if n % 2 ==0 and n !=0: return True return False # 例外狀況: 當 n = 2 時,n/2 =1 導致上述條件無法篩出 2 if n == 1: return True return False print(is_power_of_two(0)) # Should be False print(is_power_of_two(1)) # Should be True print(is_power_of_two(8)) # Should be True print(is_power_of_two(9)) # Should be False ``` ### For Loop ````python for x in range(5): print(x) ```` 1. range function - start by 0 - a list of numbers will be less than the given value > x 會從 0 開始到 4,`0, 1, 2, 3, 4`,總共 5 個項目,最後一個 x 一定是 `range 數字 - 1` 2. examples ```python= # EXAMPLE 1: do the number squared def square(n): # 平方的算法 return n*n def sum_squares(x): # 加總平方數 sum = 0 for n in range(x): sum += square(n) return sum print(sum_square(10)) # should be 285 # EXAMPLE 2: print out the range as list length friends = ['Taylor', 'Alex', 'Pat', 'Eli'] for friend in friends: print("Hi " + friend) # EXAMPLE 3: length and sum values = [23, 52, 59, 37, 48] sum = 0 length = 0 for value in values: sum += value length += 1 print("Total sum: " + str(sum) + " - Average: " + str(sum/length)) # EXAMPLE 4 def votes(params): for vote in params: print("Possible option:" + vote) votes(["yes", "no", "maybe"]) #result # Possible option:yes # Possible option:no # Possible option:maybe # EXAMPLE 5 def multiplication_table(start, stop): for x in range(1, 4): for y in range(1, 4): print(str(x*y), end=" ") print() multiplication_table(1, 3) # Should print the multiplication table shown above #result # 1 2 3 # 2 4 6 # 3 6 9 ``` #### `range()` 的用法 - range(n): 0, 1, 2, ... n-1 - range(x,y): x, x+1, x+2, ... y-1 - range(p,q,r): p, p+r, p+2r, p+3r, ... q-1 (if it's a valid increment) ```python # 設定特定的起始數字,不以 0 為起始數字 product = 1 for n in range(1, 10): product = product * n print(product) # 以 loop 計算階層,例如:4! = 1*2*3*4 def factorial(n): result = 1 for i in range(1, n+1): result = result * i return result print(factorial(4)) # 4! = 1*2*3*4, should return 24 print(factorial(5)) # 5! = 1*2*3*4*5, should return 120 # for loop 做 factorial def factorial(n): result = 1 for x in range(1, n+1): result = result * x return result for n in range(10): print(n, factorial(n)) #result # 0 1 # 1 1 # 2 2 # 3 6 # 4 24 # 5 120 # 6 720 # 7 5040 # 8 40320 # 9 362880 # range 的第三個 perameter def to_celcius(x): return (x - 32)*5/9 for x in range(0, 101, 10): #代表每 10 個循環一次 print(x, to_celcius(x)) ``` #### Nested For Loops - 雙重循環的概念 - Newline Character: `end=""` 能自動換行 - 在 `for right in range(left, 7):` 會將 `range` 數字跑完。 ```python= #EXAMPLE 1 for left in range(7): for right in range(left, 7): print("[" + str(left) + "|" + str(right) + "]", end="") print() #result # [0|0][0|1][0|2][0|3][0|4][0|5][0|6] # [1|1][1|2][1|3][1|4][1|5][1|6] # [2|2][2|3][2|4][2|5][2|6] # [3|3][3|4][3|5][3|6] # [4|4][4|5][4|6] # [5|5][5|6] # [6|6] #EXAMPLE 2 teams = ['Lakers', 'Warriors', 'Rocket', 'Celtics'] for home_teams in teams: for away_teams in teams: if home_teams != away_teams: print(home_teams + " VS " + away_teams) #Result # Lakers VS Warriors # Lakers VS Rocket # Lakers VS Celtics # Warriors VS Lakers # Warriors VS Rocket # Warriors VS Celtics # Rocket VS Lakers # Rocket VS Warriors # Rocket VS Celtics # Celtics VS Lakers # Celtics VS Warriors # Celtics VS Rocket ``` ![](https://i.imgur.com/08jmeNq.png) #### for loops 的自動化應用 - copy files to machines - process the contents of files - automatically install software #### 各種 Loop 的使用時機 - for loops 適合有列表元素的任務 - while loops 適合有條件式的重複性任務 ## Recursion - Recursion is common in soft-ware but rare in automation. - Recursion is the repeated application of the same procedure to a smaller problem, - can tackle complex problems by reducing to a simpler one. - 會有一個 base-case 設定最低值,運作方式會從 base-case 開始,一直累計到 n - 會在 function recall 自己 - 適合用在有多層套疊的情境(例如俄羅斯娃娃、多層資料夾) ```python # 典型的 Recursion 寫法 def recursive_function(parameters): if base_case_condition(parameters): return base_case_value recursive_function(modified_parameters) #EXAMPLE 1 def fatorial(n): if n < 2: return 1 return n * fatorial(n-1) #result: 1*2*3*4*.....*n # 也能寫成 def fact(n): ... if n >= 1: ... return n * fact(n-1) ... return 1 ... >>> fact(4) 24 #EXAMPLE 2 def sum_positive_numbers(n): # The base case is n being smaller than 1 if n < 1: return 0 # The recursive case is adding this number to # the sum of the numbers smaller than this one. return n + sum_positive_numbers(n-1) print(sum_positive_numbers(3)) # Should be 6 因為 1+2+3 print(sum_positive_numbers(5)) # Should be 15 因為 1+2+3+4+5 ``` ### Recursive 使用情境 - 適合:active directory, LDAP - 不適合:超過 1000 次執行次數的項目,就無法使用