xia的小窩

一起來coding和碼字吧

0%

python-Discord-bot,從0開始到做出一個機器人系列-9

寫機器人必備 – 函式的操作

創建第一個函式

1
2
3
def functionname([parameterlist]):
["comments"]
['functionbody']

functionname:函數名稱
parameterlist:可選參數,如有多個參數,須以”,”隔開
comments:可選參數,表示為函式指定註釋,通常表該函式功能
functionbody:可選參數,用於指定函式整體,如有返回值,可使用return字句返回

如想定義不做式的函式,可以使用pass做為佔位符
請注意,縮排問題

1
2
3
4
5
6
7
# 此程式碼無法運行,是因為twoSum()函式還沒有被呼叫
def twoSum(a, b)
"""
兩個數字加起來
"""
c = a + b
return c

調用函數

調用函數也就是執行函數,方法如下

1
functionname([parameterlist])

一般來說就是使用參數傳遞。

1
2
3
4
a, b = 2, 3
ans = twoSum(a, b)
print(ans)
# 5

參數傳遞

1
2
3
4
def twoSum(a, b)

# twoSum => 函式名稱
# (a, b) => 函式參數

形式參數: 在括號裡面的就是形式參數
實際參數: 在調用的時候,函式括號裡的才是實際參數

位置參數

數量必須一致、位置必須與定義時一致

1
2
3
4
5
6
7
def twoSum(a, b):
c = a + b
return c

print(twoSum(2))
# TypeError: twoSum() missing 1 required positional argument: 'b'
# 少了一個參數便動不了

關鍵字參數

呼叫函式時,在傳入參數值的前面加上函式所定義的參數名稱

為參數設默認值

1
2
def funcname(parameter1 = defaultvalue1):
pass

defaultvalue:可選參數,為該默認值

強制設置數值

1
2
3
4
5
6
7
8
def twoSum(a, b = 3):
return a + b

print(twoSum(5))
# 8
# 在沒有指定的情況下,b默認為3
print(twoSum(5, 5))
# 10

定義函式時,設置參數為默認值時須小心一點,默認參數必須指向不可變對象

可變參數

*parameter(可接收任意多個參數)

1
2
3
4
5
6
7
8
def add_all(*add):
result = 0
for i in range(len(add)):
result += add[i]
return result

print(add_all(1, 2, 3, 4, 5))
# 15

**parameter,表示可接收任意多個類似關鍵字參數一樣顯示賦值的實際參數,並放進字典中

1
2
3
4
5
6
7
8
9
10
11
12
def printSign(**sign):
print()
for key, value in sugn.items():
print(key, value)

printSign(a = "b", c = "d")
# a b
# c d

# 如果需要導入的是一個字典
# dict = {"a" : "b", "c" : "d"}
# printSign(**dict)

返回值

也就是return,如果沒有return,即返回None空值

1
2
3
4
5
6
7
8
9
10
11
# 取自python tutor
def listSum(numbers):
if not numbers:
return 0
else:
(f, rest) = numbers
return f + listSum(rest)

myList = (1, (2, (3, None)))
total = listSum(myList)
# 6

變量的作用域

局部變量(只能在函式裡呼叫)

1
2
3
4
5
6
7
8
def print_test():
mes = "god"
print(mes)

print_test()
print(mes)
# god
# NameError: name 'mes' is not defined

全域變量

1
2
3
4
5
6
7
8
mes = "god"
def print_test():
print(mes)

print_test()
print(mes)
# god
# god

也可以……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 也可以改成global
mes = "god"
print("函數外 = ", mes)

def test():
global mes
mes = "mes id god"
print("函數內 = ", mes)

test()
print("函數外 = ", mes)
# 函數外 = god
# 函數內 = mes id god
# 函數外 = mes id god

匿名函式

指的是沒有名字的函式,使用lambda表達式

1
result = lambda[arg1[arg2[.....]]]: expression

圓周率算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import math

def circlearea(r):
return math.pi * r * r

print(circlearea(10))
# 314.1592653589793
# 上述寫法同等於 ......

import math

r = 10
result = lambda r:math.pi*r*r
print(result)

注意

注意函式的參數與默認值