第 9 關、喊出我的名字

1、函數是什麼

函數是組織好的、可以重複使用的、用來實現單一功能的代碼。比如說當我們需要實現“打印”這個功能,我們會用到print();當我們需要實現“獲取數據長度”這個功能,我們會要到len()。而“print()”、“len()”都是我們的函數。

 

2、定義和調用函數

2-1、定義函數

定義函數的語法書寫:def 函數名(參數名)(注:括號內可以爲空,也可以爲多個參數,多個參數間用逗號隔開即可)

def 函數名(參數1,參數2,...參數n):

 函數體

 return 語句

函數內部一旦遇到return語句,就會停止執行並返回結果。沒有return語句的函數,Python也會在末尾隱性地加上return None,即返回None值(return None可以簡寫爲return。)

 

2-2、調用函數

(1)不帶參數的函數

def A():

print('山腳畢業')



A()

不帶參數的函數調用:直接函數名+括號可調用(運行)函數。

(2)帶參數的函數

其實我們的打印語句 print() 也是一個內置函數,他的格式大概如下:

def print('字符串'):

(打印'字符串'內容)

print('字符串')

以 print() 函數的形式來看後,我們會更好理解帶參數的函數是怎麼調用的,這裏再舉一個例子:

def teacher(name):

print(name)



teacher('七七')

這裏我們定義了函數 teacher,並帶有參數 name。這裏的 name 相當於一個鑰匙孔,teacher 相當於是一道門,如果我們沒有用鑰匙打開這個孔,我們就不能打開這道門去用裏面的東西。所以爲了打開 teacher 這道門,我們用了 ‘七七’ 這個鑰匙成功打開(賦值)給 name ,才能讓我們使用裏面的打印函數。

3、函數重要概念

3-1、默認參數

默認參數必須放在位置參數之後。若調用函數時沒有傳遞參數就爲默認值,但如果調用時向默認參數傳遞了數據,則默認參數被新參數代替。

def  menu(appetizer,course,dessert='綠豆沙'):

    print('一份開胃菜:'+appetizer)

    print('一份主食:'+course)

    print('一份甜品:'+dessert)

menu('話梅花生','牛肉拉麪')

#結果顯示爲:因爲調用時只給了兩個參數,第三個參數爲默認值

#一份開胃菜:話梅花生

#一份主食:牛肉拉麪

#一份甜品:綠豆沙

menu('話梅花生','牛肉拉麪','銀耳羹')

#結果顯示爲:因爲調用時給了三個參數,第三個參數被更新

#一份開胃菜:話梅花生

#一份主食:牛肉拉麪

#一份甜品:銀耳羹

3-2、不定長參數

一個星號*加上參數名。當傳入此處的參數數量不確定時使用,數據類型爲元組(元組(tuple):寫法是把數據放在小括號()中,它的用法和列表用法類似,主要區別在於列表中的元素可以隨時修改,但元組中的元素不可更改。列表一樣,元組是可迭代對象,這意味着我們可以用for循環來遍歷它)。

  • 當默認參數在不定長參數後時,若想更改默認參數,需要註明dessert='銀耳羹',例如:
def menu(appetizer,course,*barbeque,dessert='綠豆沙'):

    print('一份開胃菜:'+appetizer)

    print('一份主菜:'+course)

    print('一份甜品:'+dessert)

    for i in barbeque:

        print('一份烤串:'+i)

        

menu('話梅花生','牛肉拉麪','烤雞翅','烤茄子','烤玉米',dessert='銀耳羹')

#結果顯示爲:

#一分開胃菜:話梅花生

#一份主菜:牛肉拉麪

#一份甜品:銀耳羹

#一份烤串:烤雞翅

#一份烤串:烤茄子

#一份烤串:烤玉米
  • 當默認參數在不定長參數之前,則默認按順序傳遞參數(默認參數會改變),剩下的參數均傳遞給不定長參數。
def menu(appetizer,course,dessert='綠豆沙',*barbeque):

    print('一份開胃菜:'+appetizer)

    print('一份主菜:'+course)

    print('一份甜品:'+dessert)

    for i in barbeque:

        print('一份烤串:'+i)

        

menu('話梅花生','牛肉拉麪','銀耳羹','烤雞翅','烤茄子','烤玉米')

#結果顯示爲:

#一分開胃菜:話梅花生

#一份主菜:牛肉拉麪

#一份甜品:銀耳羹

#一份烤串:烤雞翅

#一份烤串:烤茄子

#一份烤串:烤玉米

3-3、return 語句

我們的長度計算語句 len() 也是一個內置函數,他的格式大概如下:

def len('內容'):

  (計算'內容'長度)

  return 長度值

a='內容'

print(len(a))

這裏再舉一個例子來解釋 return 語句:

def A():

  name = '七七'

  return name

print(A())

這裏我們函數 A 定義的內容給變量 name 賦值 ‘七七’,並且返回(return)了這個值,在代碼第 5 行,我們打印了這個函數,因爲返回了值 name ,所以會打印出 ‘七七’。

注意:執行了 return 語句後,return 下面的語句不執行(這裏依舊只打印出七七)

def A():

  name = '七七'

  return name

print('卡西')

print(A())

3-4、變量作用域

3-4-1、局部變量

在函數內定義的變量,僅能在函數內部使用(局部作用域)

def A():

  name='七七'



print(name)

上面的語句會報錯,因爲 name 是函數內的變量(即局部變量)。

3-4-2、全局變量

所有函數之外賦值的變量,可以在程序的任何位置使用(全局作用域)

teacher = '七七'

def A():

  name='卡西'

  print(teacher)



print(teacher)

A()

上面的語句運行後會打印兩次 “七七”,因爲變量 teacher 是全局變量,執行函數的時候可以正常打印出 teacher。

3-4-3、global 語句

可以將局部變量轉換爲全局變量,一般寫在函數體的第一行

def A():

  global name

  name='七七'



A()

print(name)

以上語句將我們的局部變量 name 轉換爲全局變量,讓我們在外部也能正常打印 name。(注意:一定要執行了函數 A ,纔會執行 global 語句,才能將局部變量轉換爲全局變量)

3-4-4、易錯點

局部變量和全局變量儘量不要取相同的名字,以免混淆

sum = 0

def A():

  sum = sum + 1

  print(sum)



A()

上面的代碼會報錯:“UnboundLocalError: local variable 'sum' referenced before assignment”,原因是什麼呢?這是因爲我們運行函數 A 時, sum = sum + 1 語句中,第一個 sum 是我們函數內的局部變量,而第二個 sum ,系統分辨不出是全局的還是局部的,懵了一下跟我們說我不清楚,所以要改正的話需要將局部變量轉化全局變量:

sum = 0

def A():

  global sum

  sum = sum + 1

  print(sum)



A()

3-4-5、函數嵌套

sum = rent + cost() 的結果就是sum = rent + variable_cost(cost()函數的返回值)。最後調用函數時,也只需調用sum_cost()即可。

rent = 3000



def cost():

    utilities = int(input('請輸入本月的水電費用'))

    food_cost = int(input('請輸入本月的食材費用'))

    variable_cost = utilities + food_cost

    print('本月的變動成本是' + str(variable_cost))

    return variable_cost



def sum_cost():

    sum = rent + cost()#調用函數

    print('本月的總成本是' + str(sum))



sum_cost()

4、知識拓展

4-1、list() 函數

可以將數據轉換爲列表

a='七七'

a=list(a)

print(a)

# 結果爲:['七', '七']

4-2、reversed() 函數 (以下僅做參考)

reversed()函數可以將數據反轉,從後往前迭代。

reversed()之後,第二次for循環、list()、tuple()以及join()得到的結果都爲空,原因就是b不是反轉列表本身,而是一個列表反向迭代器,所以直接輸出函數返回值會是類似於亂碼,且reversed()之後,只在第一次遍歷時返回值。

#參數是列表1:

a=[1,2,3,4,5]

b=reversed(a)

print(a)

#結果顯示爲:

#[1, 2, 3, 4, 5]

print(b)

#結果顯示爲:

#<listreverseiterator object at 0x06A9E930>

for i in b:#第一次遍歷

  print(i)

#結果顯示爲:

#5 4 3 2 1

for i in b:#第二次遍歷爲空

  print(i)

#結果顯示爲:啥也沒有



#參數是列表2:

a=[1,2,3,4,5]

b=reversed(a)

print(list(b))#第一次轉換爲列表

#結果顯示爲:

#[5,4,3,2,1]

print(list(b))#第二次

#結果顯示爲:

#[]



#參數是元組

t=(4,5,6)

tt=reversed(t)

print(t)

#結果顯示爲:

#(4, 5, 6)



print(tt)

#結果顯示爲:

#<reversed object at 0x06A07E50>



print(tuple(tt))

#第一次轉換爲元組

#結果顯示爲

#(6, 5, 4)



print(tuple(tt))

#第二次爲空

#結果顯示爲()



#參數是字符串

s='cba'

ss=reversed(s)

print(s)

#結果顯示爲

#'cba'

print(ss)

#結果顯示爲

#<reversed object at 0x06A07E70>

print(list(ss))#第一次轉換爲列表

#結果顯示爲

#['a', 'b', 'c']

print(list(ss))#第二次爲空

#結果顯示爲

#[]

5、習題

5-1、函數調用

last_month = 2000

def income():

  course_income = int(input('七七運營課程的收入是多少'))

  cafeteria_income = int(input('七七打工的收入多少'))

  income = course_income + cafeteria_income

  return income

def sum_income():

  sum = last_month + income()

  print('七七卡內餘額' + str(sum)+'元')

sum_income()

問題:七七打工一個月的工資是3000元,但因爲吃螺螄粉被咖啡廳批評,扣除了5%的工資,運營月收入爲6666元,則終端輸出結果爲?

A.七七卡內餘額2850元

B.七七卡內餘額9516元

C.七七卡內餘額11516元

D.七七卡內餘額8666元

答案:C

解析:12行調用sum_income()函數,並且在sum_income()函數內又調用了income()函數

sum = last_month + income() ,就是全局變量last_month加上income()函數的返回值。七七打工工資是3000*0.95=2850,所以返回值

variable_cost = cloths_cost + food_cost = 2850 + 6666 = 9516

sum = last_month + income() = 2000 + 9516 = 11516

5-2、函數的傳參與條件判斷

題目:編寫一個函數使其可以通過輸入零點後的分鐘數得出現在是第幾天幾點幾分,例如輸入150,需要輸出2:30.

答案:

def clock(min):

  if min//1440>0:

    day=min//1440

    min1=min%1440

    hour=min1//60

    min2=min1%60

    if min2==0:

      print('現在是第{0}天的{1}:{2}{2}'.format(day,hour,min2))

    else:

      print('現在是第{}天的{}:{}'.format(day,hour,min2))

  else:

    min1=min%1440

    hour=min1//60

    min2=min1%60

    print('現在是{}:{}'.format(hour,min2))

min=int(input('請問現在已經過去了多少分鐘?'))

clock(min)

解析:一定要考慮到可能會超過一天的情況,所以使用條件判斷來編寫,若大於一天,則用變量day存儲天數(一天有1440分鐘),min1存儲整除天數後剩下的分鐘數,hour存儲剩下分鐘數中的小時數,最後餘下min2存儲無法湊滿一小時的分鐘數。同時發現如果當min2爲0,即是整點時,結果爲零,但必須表示爲例如18:00,後面要兩個零,由此再分出條件,當爲整點時,輸出兩次0。使用format,在大括號裏提取兩次0即可。因爲變量儲存的永遠爲最新的賦值內容,所以直接更新min也可以。

def clock(min):

  if min//1440>0:

    day=min//1440 #得到整數的天數

    min=min%1440 #湊不滿一天的剩餘分鐘數

    hour=min//60 #上行剩餘分鐘數又能化爲多少小時

    min=min%60 #湊不滿一小時的剩餘分鐘數

    if min==0:

      print('現在是第{0}天的{1}:{2}{2}'.format(day,hour,min))

    else:

      print('現在是第{}天的{}:{}'.format(day,hour,min))

  else:

    min=min%1440

    hour=min//60

    min=min%60

    print('現在是{}:{}'.format(hour,min))

#輸入的分鐘數不滿一天,只需要輸出小時與分鐘



min=int(input('請問現在已經過去了多少分鐘?'))

clock(min) #調用函數

5-3、全局變量

題目:這段代碼是否正常運行,如果有錯誤,請指出錯誤。

xi = '七七'
yan = '延君'
qi = '卡西'

def check():
    if xi != '卡西' :
        xi = '卡西'
    if yan != '延君':
        yan = '延君'
    if qi != '七七':
        qi = '七七'

def say():
    print("助教{xi},{yan},{qi}祝大家成功".format(yan=yan,xi=xi,qi=qi))

check()
say()

答案:

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