(1) forjava
myList1 = ["A", "B", "C", "D"] # 正序遍歷 for item in myList1: print(item) # 倒序遍歷 for item in reversed(myList1): print(item) myList2 = list(range(1,5)) # [1, 2, 3, 4] # 等效於其它語言的for(i=0; i<4; i++) for index in range(4): myList2.append(myList1[index]) print(myList2) # [1, 2, 3, 4, 'A', 'B', 'C', 'D'] # 按索引遍歷 for index in range(len(myList2)): print("索引", index, "對應的元素是:", myList2[index])
for循環本質上是經過不斷調用迭代器(Iterator)的next()
函數來實現的:python
from collections import Iterable myList = [3, 6, 9] for i in myList: print(i) # 下面的代碼與上面的for循環等效 if isinstance(myList, Iterable): myIter = iter(myList) while True: try: x = next(myIter) print(x) except StopIteration: break
(2) whileexpress
myList = ["A", "B", "C", "D"] index = 0 while index < len(myList): print(myList[index]) index += 1
(3) break和continueapp
myList = list(range(10)) # 循環到5後跳出 index = 0 while True: print(myList[index]) if index==5: break index += 1 # 循環遇到偶數略過,只打印奇數 for item in myList: if int(item)%2==0: continue print(item)
# 定義一個空函數 def voidFun(): pass # 定義一個求和函數 def getSum(x, y): if not isinstance(x, (int, float)) and isinstance(y, (int, float)): raise TypeError("參數'x'和'y'必須爲數字") return x + y # 定義一個同時返回最大和最小值的函數 def getMinAndMax(x, y, z): return min(x, y, z), max(x, y, z) print(voidFun()) # None print(getSum(3, 5)) # 8 multiValue = getMinAndMax(3, 9, 6) print(multiValue) # 多參數返回實際上是一個Tuple # (3, 9) minValue, maxValue = getMinAndMax(3, 9, 6) print(minValue, maxValue) # 3 9
默認參數示例:函數
def enroll(name, age, sex="male", gold=0, country="China"): print("name:",name,"\n", "age:",age,"\n", "sex:",sex,"\n", "gold:",gold,"\n", "country:",country) enroll("wayne", 23) # wayne 23 male 0 China enroll("tina", 19, "female") # tina 19 female 0 China enroll("andy", 28, gold=15) # andy 28 male 15 China
默認參數須要注意的一點是:默認值最好設置爲不可變值(例如字符串或數字),不然會帶來意料以外的情況:code
def addItemToList(myList=[]): myList.append("End") print(myList) # 提供參數連續調用2次是正常的,由於每次是以新的參數值傳入 addItemToList([1, 2]) addItemToList([1, 2]) # [1, 2, 'End'] # [1, 2, 'End'] # 當使用默認參數連續調用2次時,第1次已經改變了默認參數指向的List addItemToList() addItemToList() # ['End'] # ['End', 'End']
針對上面的例子,能夠修改默認值爲None
:排序
def addItemToList(myList=None): if myList is None: myList = [] myList.append("End") print(myList)
可變參數示例:索引
def getSum(*numbers): sum = 0 for i in numbers: sum += i print(sum) return sum getSum() # 0 getSum(1, 2, 3) # 6 myTuple = (1, 3, 5) getSum(*myTuple) # 9
關鍵字參數示例:ip
def enroll(name, age, **params): if "gold" in params: print('傳了"gold"這個參數') print("params:",params) enroll("wayne", 23, gold=15, sex="male") # 傳了"gold"這個參數 # params: {'gold': 15, 'sex': 'male'}
限制關鍵字參數必需要以key=value
的形式提供參數,它的定義是以*
分隔:內存
def enroll(name, age, *, gold, country): pass # enroll("wayne", 23, 15, country="China") 未提供關鍵字將報錯 enroll("wayne", 23, gold=15, country="China")
若是函數中間存在一個可變參數,在這個可變參數後面的參數自動會被認定爲限制關鍵字參數:
def enroll(name, age, *skills, gold, country): pass # 未提供關鍵字"gold"將報錯 # enroll("wayne", 23, "java", "python", 15, country="China") enroll("wayne", 23, "java", "python", gold=15, country="China")
當建立一個List或Array時,當元素個數越多,則佔用的內存就越高;generator能很好的解決內存佔用問題,它的特色是邊循環邊計算,在處理相似斐波拉契數列的場合很是有用。
定義generator和定義函數比較相似,python經過判斷是否含有yield
關鍵字來加以區分:
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a+b n = n + 1 for i in fib(10): print(i)
python支持函數參數,示例以下:
def add(x, y): return x+y def multiply(x, y): return x*y def compute(x, y, fun): return fun(x, y) print(compute(2, 5, add)) print(compute(3, 6, multiply))
map
函數可讓一個Iterable裏面的每個元素執行同一個函數:
def square(x): return x * x myTuple = tuple(map(square, (2, 4, 6))) # (4, 16, 36) myList = list(map(str,[1, 3, 5])) # ['1', '3', '5']
reduce
函數把一個函數做用在一個序列上,這個函數接收兩個參數,reduce
把結果繼續和序列的下一個元素作累計計算:
from functools import reduce def multiply(x, y): return x*y result = reduce(multiply, [1, 2, 3, 4]) print(result) # 24
lambda
表達式提供了一個更加簡練的函數式語法來寫匿名方法,它的調用形式是lambda argument_list: expression
,argument_list是參數列表,expression是表達式,表達式中出現的參數須要在參數列表中有定義。
用法一:將lambda函數賦值給一個變量,經過這個變量間接調用該lambda函數:
add = lambda x,y:x+y add(3,5)
用法二:將lambda函數賦值給其餘函數,從而將其餘函數用該lambda函數替換:
import time # 屏蔽sleep函數 time.sleep = lambda x:None time.sleep(10) print("test")
用法三:將lambda函數做爲參數傳遞給其餘函數。
myList = list(map(lambda x: x*x, [2, 3, 4])) print(myList) # [4, 9, 16]
filter
函數用於過濾列表,須要實現一個過濾函數:
# 過濾出奇數 def is_odd(n): return n%2 == 1 myList = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])) print(myList) # [1, 3, 5, 7, 9] # 過濾出非空字符串 def not_empty(s): return s and s.strip() myList = list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) print(myList) # ['A', 'B', 'C']
sorted
函數用於排序,它接收3個參數:列表,key函數,reverse(正向/反向)。調用sorted函數後並不更改原列表,而是返回一個排序後的可循環列表:
# 默認按升序排列,注意字符串是以ASCII碼大小來排序的 myList = ["a", "B", "c", "D"] print(sorted(myList)) # ['B', 'D', 'a', 'c'] # 若是字符串要以"A-Z"的順序排序,能夠先將字母所有轉換成大寫或小寫 myTuple = ("BOY", "apple", "Pig", "monkey") print(sorted(myTuple, key=str.lower)) # ['apple', 'BOY', 'monkey', 'Pig'] # 按絕對值的倒序排序 myList = [15, 23, -9, 100, -36] print(sorted(myList, key=abs, reverse=True)) # [100, -36, 23, 15, -9]