1. 程式人生 > >《零基礎入門學習Python》(19)--函式:我的地盤聽我的

《零基礎入門學習Python》(19)--函式:我的地盤聽我的

前言

接下來仔細講講函式與過程和區域性變數和全域性變數的作用範圍

知識點

函式與過程

  • 在許多程式語言中,函式(function)是有返回值的,過程(procedure)是簡單、特殊並且沒有返回值的。而在Python中,嚴格來說只有函式沒有過程。 

例如:

>>> def hello():
    print('hello fishc!')


>>> temp = hello()
hello fishc!

>>> temp
#沒有任何顯示,為什麼?因為我們這個hello函式沒有return任何東西。

>>> print(temp)
None

>>> type(temp)
<class 'NoneType'>
#就算函式沒有寫上return語句,python也會返回一個None物件
  • 在Python中,函式是可以返回多個值的,如下:
>>> def back():
    return [1,'xiaojiayu',3.14]

>>> back()
[1, 'xiaojiayu', 3.14]
>>> def back():
    return 1,'xiaojiayu',3.14

>>> back()
(1, 'xiaojiayu', 3.14)

區域性變數與全域性變數

在函式裡面定義的引數以及變數都稱之為區域性變數; 

在函式外邊定義的變數稱之為全域性變數。

函式內若試圖修改全域性變數,Python會新建一個同名區域性變數用於儲存修改值,原全域性變數的值不變。

 

def discounts(price,rate):
    final_price = price * rate
#   print('這裡試圖列印全域性變數old_price的值是:',old_price)
    old_price = 50 #這裡試圖修改全域性變數
    print('修改後old_price的值1是:',old_price)
    return final_price

old_price = float(input('請輸入原價:'))
rate = float(input('請輸入折扣率:'))
new_price = discounts(old_price,rate)
print('修改後old_price的值2是:',old_price)
print('打折後價格是:',new_price)
#print('這裡試圖列印區域性變數final_price的值:',final_price)

#請輸入原價:100
#請輸入折扣率:0.8
#打折後價格是: 80.0
#Traceback (most recent call last):
#  File "D:\python test\區域性變數和全域性變數.py", line 12, in <module>
#    print('這裡試圖列印區域性變數final_price的值:',final_price)
#NameError: name 'final_price' is not defined

#在函式裡面定義的引數以及變數都稱之為區域性變數,
#在函式外邊定義的變數稱之為全域性變數


==================== RESTART: D:\python test\區域性變數和全域性變數.py ====================
請輸入原價:100
請輸入折扣率:0.8
修改後old_price的值1是: 50
修改後old_price的值2是: 100.0
打折後價格是: 80.0
--------------------- 

課後習題

測試題:

  • 下邊程式會輸入什麼?
def next():
    print('我在next()函式裡……')
    pre()

def pre():
    print('我在pre()函式裡……')

next()

執行結果:
================== RESTART: C:/Users/ThinkPad/Desktop/11.py ==================
我在next()函式裡……
我在pre()函式裡……
--------------------- 
  • 以下函式有返回值嗎?
>>> def hello():
    print('Hello FishC!')

如果沒有使用return語句指定返回值,Python也不是什麼都不返回id,Ta會返回一個None物件,所以我們說Python所有的函式都有返回值。

>>> def hello():
        print('Hello FishC!')
>>> temp = hello()
Hello FishC!
>>> temp
>>> print(temp)
None
  • 請問Python的return語句可以返回多個不同型別的值嗎?
#可以丫,預設用逗號隔開,是以元祖的形式返回,你當然也可以用列表包含起來返回:
>>> def myFun():
        return 'gogo', 520, 3.14, True

>>> myFun()
('gogo', 520, 3.14, True)
>>> def myFun2():
        return ['小甲魚', 1314, 5.12, False]

>>> myFun2()
['小甲魚', 1314, 5.12, False]
>>>
--------------------- 
  • 目測以下程式會列印什麼內容
def fun(var):
    var = 1314
    print(var, end='')

var = 520
fun(var)
print(var)

執行結果:
1314520
  • 目測以下程式會列印什麼內容?
var = 'Hi'

def fun1():
    global var
    var = ' Baby '
    return fun2(var)

def fun2(var):
    var += 'I love you'
    fun3(var)
    return var

def fun3(var):
    var = '小甲魚'

print(fun1())

執行結果:
================== RESTART: C:/Users/ThinkPad/Desktop/11.py ==================
 Baby I love you
--------------------- 

動動手

編寫一個函式,判斷傳入的字串引數是否為“迴文聯”(迴文聯就是順序輸出等於逆序輸出)

##方法一:
def huiwen(string):
    length = len(string)
    last = length - 1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1

    if flag == 1:
        return 1
    else:
        return 0

string = input('請輸入一句話:')
if huiwen(string) == 1:
    print('是迴文聯')
else:
    print('不是迴文聯')

##方法二:
def huiwen(string):
    list1 = list(string)
    list2 = reversed(list1)
    if list1 == list(list2):
        return '是'
    else:
        return '不是'
print(huiwen('上海自來水來自海上'))
---------------------