函數
在Python中,函數包含以下幾部分:
- def關鍵字
- 函數名
- 由括號()包圍着的參數列表,每個參數之間用逗號隔開。
- 在下一行,縮進的代碼塊(稱爲函數體)
例如:
def hello(name):
print('hello , ' + name)
hello('xiong')
hello('jiang')
運行結果爲:
hello , xiong
hello , jiang
值得注意的是,有些人習慣稱函數參數爲“變元”。
變元是一個變量,當函數被調用時,參數就存放在其中,同時,保存在變元中的值,在函數返回後就丟失。
比如上面代碼中的name。
return語句
一般來說,函數調用求值的結果稱爲函數的“返回值”。
用def語句創建函數時,可以用return語句指定應該返回什麼值。
return語句包含以下部分:
- return關鍵字。
- 函數應該返回的值或表達式
- 如果在return語句中使用了表達式,返回值就是該表達式求值的結果。
例如:
import random
def get_answer(answer_number):
if answer_number == 1:
return 'It is certain'
elif answer_number == 2:
return 'It is decidedly so'
elif answer_number == 3:
return 'yes'
elif answer_number == 4:
return 'reply hazy try again'
elif answer_number == 5:
return 'ask again later'
elif answer_number == 6:
return 'concentrate and ask again'
elif answer_number == 7:
return 'my reply is no'
elif answer_number == 8:
return 'outlook not so good'
elif answer_number == 9:
return 'very double'
r = random.randint(1,9)
fortune = get_answer(r)
print(fortune)
關鍵字參數
大多數參數是由它們在函數調用中的位置來識別的。
但是,“關鍵字參數”是由函數調用是加在它們前面的關鍵字來識別的。
關鍵字參數通常用於可選變元。
我們以print函數爲例:
print函數有可選的變元end和sep,分別指定在參數末尾打印什麼,以及在參數之間打印什麼來隔開它們。
print('hello')
print('world')
運行結果
hello
world
因爲print函數會自動在傳入的字符串末尾添加換行符。
我們可以通過設置end關鍵字參數,將它變成另一個字符串。
print('hello' , end='')
print('world')
運行結果
helloworld
又例如:
print('cat' , 'dog' , 'monkey')
運行結果:
cat dog monkey
因爲先print函數傳入多個字符串值時,print函數會自動用一個空分隔它們。
我們可以通過設置sep關鍵字參數,替換掉默認的分隔字符串。
print('cat' , 'dog' , 'monkey' , sep=',')
運行結果:
cat,dog,monkey
None值
None是NoneType數據類型的唯一值。
None表示沒有值。
比較常見的一個使用None的地方就是print函數的返回值。
前面我們說過,所有函數調用都需要求值爲一個返回值。
print函數的作用是在屏幕上顯示文本,它不需要返回任何值,所以print函數就返回None。
另外,對於所有沒有return語句的函數定義,Python都會在末尾加上return語句。
作用域
在被調用函數內賦值的變元和變量,處於該函數的“局部作用域”。處於局部作用域的變量被稱爲“局部變量”。
在所有函數之外賦值的變量,屬於“全局作用域”。處於全局作用域的變量,被稱爲“全局變量”。
如下圖所示:
只有一個全局作用域。在程序開始時創建。如果程序終止,全局作用域被銷燬,它的所有變量就被丟棄。
一個函數被調用時就會創建一個局部作用域。在這個函數內部被賦值的所有變量存在於該局部作用域內。該函數返回時,這個局部作用域就被銷燬了,這些變量就丟失了。
關於局部變量和全局變量,我們有3點值得注意。
全局作用域中的代碼不能使用任何局部變量
def spam():
eggs = 31337
spam()
print(eggs)
運行結果:
Traceback (most recent call last):
File "/home/xiongjunkun/PycharmProjects/untitled/demo.py", line 5, in <module>
print(eggs)
NameError: name 'eggs' is not defined
但是,局部作用域可以訪問全局變量
def spam():
print(eggs)
eggs = 42
spam()
print(eggs)
運行結果:
42
42
局部作用域不能使用其他局部作用域內的變量
def spam():
eggs = 99
bacon()
print(eggs)
def bacon():
ham = 101
eggs = 0
spam()
運行結果:
99
名稱相同的局部變量和全局變量合法
def spam():
eggs = 'spam local'
print(eggs)
def bacon():
eggs = 'bacon local'
print(eggs)
spam()
print(eggs)
eggs = 'global'
bacon()
print(eggs)
運行結果:
bacon local
spam local
bacon local
global
運行流程如下:
global語句
如果需要在一個函數內修改全局變量,就使用global語句。
如果在函數的頂部存在global語句,它就是告訴python:在這個函數中,此變量是全局變量,所以不要用這個變量名創建一個局部變量。
def spam():
global eggs
eggs = 'spam'
def bacon():
eggs = 'bacon'
def ham():
print(eggs)
eggs = 42
spam()
print(eggs)
運行結果:
spam
異常處理
在我們的程序中,錯誤可以由try和except語句來處理。
那些可能出錯的語句被放在try子句中。
如果在try子句中的代碼導致了一個錯誤,程序執行就立即轉到except子句的代碼。
在運行那些代碼之後,執行照常繼續。
def spam(divide_by):
try:
return 42 / divide_by
except ZeroDivisionError:
print('Error:Invalid argument')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
導入模塊
Python程序可以調用一組基本的函數,這些函數稱爲“內建函數”。
包括print函數、input函數、len函數等。
Python程序也包括一組模塊,稱爲“標準庫”。
每個模塊都是一個Python程序,包含一組相關的函數,可以嵌入我們的函數之中。
在開始使用一個模塊中的函數之前,我們必須導入模塊。
最好的導入模塊的形式是使用普通的import語句,import語句包含以下部分:
- import關鍵字
- 模塊的名稱
- 可選的更多模塊名稱,之間用逗號分隔。
import random
for i in range(5):
print(random.randint(1,10))
from 模塊 import *
import語句的另一種形式包括from關鍵字,之後是模塊名稱,import關鍵字和一個星號*。
使用這種形式的import語句,調用模塊中的函數時不需要使用“模塊.”前綴。