二.Python函式
1.自定義函式
除了可以使用Python內建提供函式,
我們自己也可以創建我們自己定義的函式使用

自己動手:

def hello():
 print('H')
 print('H!')
 print('H!!')
hello()
hello()
hello()

輸出結果:

H
H!
H!!
H
H!
H!!
H
H!
H!!

講解:
def是用來定義函式hello()
程式本體區塊是print('H')
              print('H!')
              print('H!!')
這段程式碼要在呼叫函式時才會執行
並非定義函式脂嘔就會執行,這點非常重要。

因為我們在最後面呼叫了三次函式,所以他會印出三次結果

2.def陳述句和參數
之前學到print()以及len()函式,會在括號當中傳入一些值
那些我們稱為引數
我們在自定義的函式也可以定義要接收的引數
自己動手:
def hello(name):
 print('Hello'+name)
hello('Alice')
hello('Bob')

輸出結果:
HelloAlice
HelloBob


#參數有一項重點要留意,存放在參數的值在函式返回時就會丟掉,以前面程式為例
如果在hello('Bob')後面加上一行print(name)
程式會回報NameError錯誤

3.返回值和return陳述句
呼叫函式返回的結果,就稱為返回值

用自定義函式方法def時,可以呼叫return陳述句

return陳述句構成要件:
a.return這個關鍵字
b.函式要返回的值或表示式

自己動手:
import random
def getAnswer(answerNumber):
   if  answerNumber==1:
       return'It is certain'
   elif answerNumber==2:
        return'It is decidedly'
   elif answerNumber==3:
        return'YES'
   elif answerNumber==4:
        return'NO'
r=random.randint(1,4)
bear=getAnswer(r)
print(bear)

輸出結果:
因為是隨機的
上面print函式呼叫的四種結果都有可能發生


講解:
程式處理順序很重要,所以我會依照程式處理順序講解.
(1)匯入random模組
(2)自定義getAnswer函式(非執行)
(3)呼叫random.randint函式
  r=random.randint(1,4)這行是指,
  從引數1到4這個數值,隨機取出一個數,存入r變數
(4)呼叫getAnswer函式
  因為getAnswer的引數是由random.randint函式隨機取得,
  所以隨機取地的數字再帶入getAnswer函式,
  就會有四種可能的輸出字串
  並且將輸出字串存入變數bear
(5)呼叫print函式印出字串

#小百科
其實呢
r=random.randint(1,4)
bear=getAnswer(r)
print(bear)
這三行是可以簡化的
因為可以把返回值當成引述給另一個函式使用
所以可以寫成
print(getAnswer(random.randint(1,4)))

4.None值
在Python當中,None代表沒有值的意思
None第一個字母要大寫
假設要存放東西在變數中,
又不希望跟其他值搞混,就可以使用
自己動手:

spam=print('111')
#先數入上面那行執行之後,在執行頁面輸下面那行
None==spam

結果:True


5.關鍵字引數與print()
所謂的引數應該還記得吧?是放在函式當中的。
但是位置不同會導致不同結果,下面舉例
第一個引數是範疇的下限,第二個引數是範疇的上限。
fandom.randint(1,10)
fandom.randint(10,1)
所以fandom.randint(10,1)會產生錯誤

複習完引數之後,要來講一個新的東西,
叫做"關鍵字引數"

舉例而言,print()函式有兩個關鍵字引數可以使用(end以及sep)
馬上動手(end):
print('HI!',end='')
print('min')

結果:

HI!min

解說:
正常而言我們下兩行不同的print(),他輸出結果會是上下兩行
會變成
HI!
min
這是因為print()預設在傳入的字串尾端添加換行符號的緣故。
#  end這個關鍵字引數功能為在引數尾端添加東西。
我們在例子當中,利用end在字串後面添加空字串,
改變了原本的預設,所以才能輸出連著的字喔!

另一個例子(sep):
print('HI!','min','min',sep=',')

結果:
HI!,min,min

解說:
#  sep這個關鍵字引數功能為在引數中間添加東西。

6.區域和全域作用範圍

這個聽起來很難,但希望你不要想得太複雜。
定義就是
變數在函式內指定則稱為區域變數
變數在函式外指定則稱為全域變數
僅此而已。
但有一點必須謹記,變數必須是這兩者其中之一,不可以既是區域又是全域。
還有以下幾個規則
#全域作用的程式碼不能使用區域變數
#區域作用可以使用全域變數
#函式區域內的程式碼,不能取用其他區域的變數
#在不同作用範疇中可以使用相同名稱變數,
簡言之,區域變數假設命名app,全域也可命名app

為什麼會需要區分全域變數,區域變數?
都一次都是全域變數不是很方便嗎?
這樣區分的原因是什麼?

這樣子的原因是因為,當一個函式修改變數而導致程式出錯時
可能會導致無法查找該錯誤源頭
但是如果是區域變數這樣的形式
就很容易查找是哪一個函式出錯了!

接下來我們來練習以下四個例子,更深刻的記得區域跟全域變數的差別吧!
=================================
(1)區域變數不能用在全域作用範疇內
(2)區域作用範籌不能取用其他區域範疇變數
(3)區域作用範籌可以存取全域變數
(4)全域跟區域變數名稱相同
=================================
(1)區域變數不能用在全域作用範疇內
def app():
    egg=555
app()
print(egg)
結果:NameError: name 'egg' is not defined

講解:
出錯原因是
我們定義函式app的  egg=5
然後在全域區域呼叫函式app
執行區域函式egg=5
"但是"
print要印出egg卻是在全域區域呼叫,區域函式執行完就已經關閉銷毀
所以無法得出egg的值

(2)區域作用範籌不能取用其他區域範疇變數
def app():
    egg=555
    qoo()
    print(egg)
def qoo():
    egg=666
app()
結果:
555
講解:
a.執行app()建立一個區域作用範籌,egg被存入666
b.執行qoo()建立第二哥區域作用範籌,egg被存入555
<<此時會發現,有兩個區域範疇,並且有兩個egg>>
c.qoo()返回時銷毀
d.執行app()中的print()
e.印出555


(3)區域作用範籌可以存取全域變數

def app():
    print(egg)
egg=666
app()
print(egg)

結果:
666
666
講解:
不難發現這個範例的app函式沒有定義egg值,
所以他輸出結果是取用全域變數的值~

(4)全域跟區域變數名稱相同

雖然區域跟全域變數名稱一樣合法,但是建議還是不要這樣做。

7.global陳述句

如果想在函式內修改全域變數,可利用global陳述句

動手:
def app():
    global egg
    egg='ww'
egg='pp'
app()
print(egg)

結果:
ww

講解:
在app()內有定義egg全域變數,所以原本的pp會被改成ww

8.最後,來打出一個猜數字遊戲吧!

#猜數字遊戲
import random
sN=random.randint(1,20)
print('猜1到20當中的數字')

#讓玩家猜六次
for guess in range(1,7):
    print('猜吧')
    guess=int(input())

    if guess<sN:
        print('太小')
    elif guess>sN:
        print('太大')
    else:
        break
if guess==sN:
    print('猜對了'+str(guess))
else:
    print('猜錯了'+str(guess))


可以先複製程式去玩玩,之後再手打
輸出結果:
猜1到20當中的數字
猜吧
2
太小
猜吧
5
太小
猜吧
15
太大
猜吧
10
太小
猜吧
13
太小
猜吧
14
猜對了14


(這個是我猜的過程  所以每個人的輸出結果是不一樣的)

講解:

這隻程式融合第一章跟第二章所學
如果有看不懂可以回去看看前面篇章

arrow
arrow
    文章標籤
    Python 函式
    全站熱搜
    創作者介紹
    創作者 Zoe 的頭像
    Zoe

    Zoe的生活分享(包含自我成長,學習,旅遊)

    Zoe 發表在 痞客邦 留言(0) 人氣()