《原神攻略》煙緋詳細培養攻略
1.1 函式
函式是可以反覆執行的程式碼塊,具有函式名,引數,返回值。
1.2 定義函式
函式必須先定義後執行。
def 函式名(引數列表):
函式體
return 返回值
沒的返回資料時,返回None
def circle_area(radius: float) -> float:
return 3.14 * radius * radius
radius = 15
area = circle_area(radius)
print("半徑是{}圓的面積是:{}.".format(radius, area))
1.3 函式的引數
傳遞引數有多種形式
1.3.1 使用關鍵字引數
在呼叫時寫上引數的名稱。
- 呼叫時可以不按定義順序,指定名稱就可以。
- 如果一個引數用關鍵字引數,後面的引數都需要用關鍵字引數
def rect_area(width: float, height: float) -> float:
return width * height
print(rect_area(width=100,height=30))
1.3.2 引數預設值
在定義函式時為引數指定一個預設值,呼叫時不傳遞資料則按預設值計算。
def rect_area(width: float, height: float = 30.0) -> float: return width * height print(rect_area(width=100, height=30)) # 結果同上,height按預設值30計算 print(rect_area(width=100))
1.3.3 可變引數
一個函式可以接收不確定數量的引數。
1.3.3.1 *可變引數
可以傳遞任意數量的引數(位置引數)
# *args會被包裝成一個元組 def calc_sum(*args) -> float: print(type(args)) # tuple _sum = 0 for value in args: # 遍歷元組獲取裡面的值 _sum += value return _sum print(calc_sum(1,2,3,4,5)) # 如果傳遞的是一個元組物件,必須解包: *元組物件 print(calc_sum(*(3,4,5)))
對於可變引數後面有普通引數的的呼叫:
def calc_sum(*args, multiple:int) -> float:
print(type(args))
_sum = 0
for value in args:
_sum += value
return _sum * multiple
# 在呼叫時必須按關鍵字引數指定其名稱
print(calc_sum(1,2,3,4,5, multiple=10))
1.3.3.1 **可變引數
這些引數會被包裝成一個字典(關鍵字引數)
def put_student(**info) -> None:
print(type(info)) # dict
for key, value in info.items():
print("{} -> {}".format(key, value))
put_student(name="張三", sex="男", age=10)
# 如果傳遞的是字典物件,必須解包: **字典物件
put_student(**{'name': '李四', 'sex': '男', 'age': 10})
1.3.4 強制位置引數
Python3.8 新增了一個函式形參語法 / 用來指明函式形參必須使用指定位置引數,不能使用關鍵字引數的形式。
在以下的例子中,形參 a 和 b 必須使用指定位置引數,c 或 d 可以是位置形參或關鍵字形參,而 e 和 f 要求為關鍵字形參:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
以下使用方法是正確的:
f(10, 20, 30, d=40, e=50, f=60)
以下使用方法會發生錯誤:
f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用關鍵字引數的形式
f(10, 20, 30, 40, 50, f=60) # e 必須使用關鍵字引數的形式
1.4 函式返回值
返回值有三種形式:
- 無返回值
- 返回單一值: return 5
- 返回多個值:return 5,6
1.4.1 無返回值
無返回值實際上返回一個None,表示沒有。
Python中的None 是什麼?
-
python中的None是一個特殊的常量
-
它既不是0,也不是False,也不是空字串。它只是一個空值的物件,也就是一個空的物件
-
None可作為一個物件,該物件的型別為:NoneTye
-
None 表示的含義,更多的是一種不存在,是真正的空,而不是空列表([])的空,也不是空的字串
def test():
return
return None # 這兩個返回意義一樣。
1.4.2 返回單一值
def test():
return 3
1.4.3 返回多個值
多個值之間用逗號分隔,會被打包成元組。
import random
def random_value():
a = random.randint(0, 100)
b = random.randint(0, 100)
return a, b
v = random_value()
print(v, type(v)) # 輸出兩個值的元組
1.5 遞迴函式
就是自己呼叫自己
- 要有一個出口,防止死迴圈。(結束條件)
def r_sum(n: int) -> int:
if n == 1:
return 1 #出口
else:
return n + r_sum(n - 1)
print(r_sum(100))
1.6 匿名函式
就是一個沒有名稱的函式,所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函式。
匿名函式有許多引數,但只能有一個程式碼錶達式,然後將結果返回。
lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。
匿名函式一般與高階函式一同使用。
1.6.1 定義匿名函式
lambda:引數1,引數2,... : 一個表示式
f_add = lambda x, y: x + y # 匿名函式賦值給一個變數,這個變數就是一個函式物件
print(type(f_add)) # <class 'function'>
print(f_add(3,4))
1.7 巢狀函式
預設定義的函式都是全域性的,在一個函式內定義函式稱為“巢狀函式”
def calc_fun(op):
# 定義兩個巢狀函式
def add(a, b):
return a + b
def sub(a, b):
return a - b
# 返回函式物件
if op == '+':
return add
else:
return sub
f1 = calc_fun('+')
f2 = calc_fun('-')
print(f1(3,3,)) # 6
print(f2(3,3,)) # 0
1.8 高階函式
1.8.1 filter()過濾函式
filter(function, iterable)
iterable是可迭代物件,函式執行時iterable會被遍歷,它的元素逐一傳入function函式,function函式返回布林值,如果為True留下。
返回filter可迭代物件
users = ['Tony', 'Tom', 'Den', 'Alex']
a = filter(lambda x: x.startswith('T'), users)
print(list(a)) # ['Tony', 'Tom']
print(users) # ['Tony', 'Tom', 'Den', 'Alex']
1.8.2 map()對映函式
map(function,iterable)
iterable是可迭代物件,函式執行時iterable會被遍歷,它的元素逐一傳入function函式,function函式對傳遞的元素進行變換, 返回map可迭代物件。
users = ['Tony', 'Tom', 'Den', 'Alex']
a = map(lambda x: x.lower(), users)
print(list(a)) # ['tony', 'tom', 'den', 'alex']