《Python編程快速上手——讓繁瑣的工作自動化》讀書筆記2

其實,寫這個是爲了督促自己看書……然後 ……其實沒有然後了,人一鬆懈下來,就……ε=(´ο`*)))唉

第三章 函數

①def語句和參數

先舉一個簡單的例子:

def hello():
    print('Hello World!')

hello()
hello()
hello()
輸出:
Hello World!
Hello World!
Hello World!

注意:一定要記得冒號(被無數次報錯,內心崩潰,絕望)

好了,上面這種做法很類似在C++中的這種操作
#include<bits/stdc++.h>
using namespace std;
void hello()
{
    cout<<"Hello World!\n";
}
int main()
{
    hello();
    hello();
    hello();
    return 0;
}

所以,我們看到,在括號裏是沒有參數的。
如果僅僅可以這樣,那這種語言……還不如沒有……
所以,理所當然,括號裏也可以出現參數,舉例如下:

def hello(name):
    print('Hello '+name+'!')

hello('Alice')
hello('Bob')

輸出:
Hello Alice!
Hello Bob!
------日常歪樓-------
對了,忘了提一點,在Python中,與C++不同,寫在不同行的輸出在運行的時候,輸出的內容也會在不同行,如果要同行輸出,就需要用逗號隔開。 
比如:
print('Hello ')
print('World!')

最後得到的是:
Hello
World!
這是因爲print()函數自動在傳入字符串末尾添加了換行符。          
但是        :
設置end關鍵字參數,像這樣,也可以實現:Hello World!
代碼如下:
print('Hello ',end='')
print('World!')

同時,注意,還有別的操作,像這樣:
print('cats','dogs','mice')
#output:cats dogs mice
print('cats','dogs','mice',sep=',')
#output:cats,dogs,mice
---------言歸正傳-------
在上面的函數中,有一個名爲name的變量當函數被調用的時候,參數就儲存在這個變量中。



②返回值和return語句
 還是舉例說明:
 
import random
def getAnswer(answerNumber):
    if answerNumber==1:
        return 'It is certain'
    elif answerNumber==2:
        return 'It is decidedly so'
    elif answerNumber==3:
        return 'Yes'
    elif answerNumber==4:
        return 'Reply hazy try again'
    elif answerNumber==5:
        return 'Ask again later'
    elif answerNumber==6:
        return 'Concentrate and ask again'
    elif answerNumber==7:
        return 'My reply is no'
    elif answerNumber==8:
        return 'Outlook not so good'
    elif answerNumber==9:
        return 'Very doubtful'
        
r=random.randint(1,9)
fortune=getAnswer(r)
print(fortune)

輸出主要看運氣……
比如,我是這種:
Concentrate and ask again

return語句包括:
return關鍵字;
函數應該返回的值或表達式。
在上面的函數裏函數的名字是:getAnswer,參數的名字是:answerNumber。
r=random.randint(1,9)
fortune=getAnswer(r)
print(fortune)
這裏也可以寫成一行:
print(getAnswer(random.randint(1,9)))

如↑所示。



③None值
None值就是沒有值,要注意首字母大寫
None是NoneType數據類型的唯一值(在其他語言中,被稱爲null、nil或undefined)



④局部和全局作用域
作用域很重要,灰常重要,格外重要:
全局作用域中的代碼不能使用任何局部變量;
但是局部作用域可以訪問全局變量;
一個函數的局部作用域中的代碼,不能使用其他局部作用域中的變量;
如果在不同的作用域中,你可以用相同的名字命名不同的變量。

1、局部變量不能在全局作用域內使用
比如:
def spam():
    eggs=31337
spam()
print(eggs)
報錯信息如下:
Traceback (most recent call last):
  File "/usercode/file.py", line 4, in <module>
    print(eggs)
NameError: name 'eggs' is not defined

其實也就是說,eggs變量只屬於spam()調用所創建的局部作用域。在程序執行從spam返回後,該局部作用域就被銷燬了,不再有名爲eggs的變量

2、局部作用域不能使用其他局部作用域內的變量

比如:
def spam():
    eggs=99
    bacon()
    print(eggs)
def bacon():
    ham=101
    eggs=10
spam()

輸出:
99
可以很容易發現,在bacon中對eggs的賦值被完完全全忽略了……spam和bacon是兩個局部作用域,所以bacon中的eggs與spam中的eggs的唯一關係就是名字恰好一樣……


3、全局變量可以在局部變量中讀取
def spam():
    print(eggs)
eggs=42
spam()
print(eggs)

輸出:
42
42
在這裏eggs就在全局變量中,所以局部作用域spam可以讀取

4、名稱相同的局部變量和全局變量
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語句
舉例如下:
def spam():
    global eggs
    eggs='spam'
eggs='global'
spam()
print(eggs)
    
輸出:
spam


如何區分局部變量和全局變量
1、如果變量在全局作用域中使用(即在所有函數之外),它就總是全局變量
2、如果在一個函數中,有針對該變量的global語句,它就是全局變量
3、否則,如果該變量用於函數中的賦值語句,它就是局部變量
4、如果該變量沒有用在賦值語句中,就是全局變量

舉例:
def spam():
    global eggs
    eggs='spam'#this is global

def bacon():
    eggs='bacon'#this is local

def ham():
    print(eggs)#this if global
    
eggs=42#this is global
spam()
print(eggs)
    
輸出:
spam




⑥異常處理
用try except語句調試,具體方法和C++裏調試的方法區別不大,就是截取片段來試,醬紫。




'''
然後接下來,書裏是一個很……的小程序,就不放上來了,或者哪天實在無聊敲一下。
所以就到這裏啦。(✺ω✺)
'''



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