函數

函數

在Python中,函數包含以下幾部分:

  1. def關鍵字
  2. 函數名
  3. 由括號()包圍着的參數列表,每個參數之間用逗號隔開。
  4. 在下一行,縮進的代碼塊(稱爲函數體)

例如:

def hello(name):
    print('hello , ' + name)

hello('xiong')
hello('jiang')

運行結果爲:

hello , xiong
hello , jiang

值得注意的是,有些人習慣稱函數參數爲“變元”。

變元是一個變量,當函數被調用時,參數就存放在其中,同時,保存在變元中的值,在函數返回後就丟失。

比如上面代碼中的name。

return語句

一般來說,函數調用求值的結果稱爲函數的“返回值”。

用def語句創建函數時,可以用return語句指定應該返回什麼值。

return語句包含以下部分:

  1. return關鍵字。
  2. 函數應該返回的值或表達式
    1. 如果在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語句包含以下部分:

  1. import關鍵字
  2. 模塊的名稱
  3. 可選的更多模塊名稱,之間用逗號分隔。
import random
for i in range(5):
    print(random.randint(1,10))

from 模塊 import *

import語句的另一種形式包括from關鍵字,之後是模塊名稱,import關鍵字和一個星號*。

使用這種形式的import語句,調用模塊中的函數時不需要使用“模塊.”前綴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章