1. 程式人生 > >python基礎——函式二

python基礎——函式二

目錄

 

一.名稱空間和訪問名稱空間中的內容:

二.名稱空間的載入和查詢順序 :

三.作用域:

四.global和nonlocal關鍵字:

五.遞迴函式:

六.內建函式:


一.名稱空間和訪問名稱空間中的內容:

1.名稱空間:

區域性名稱空間:記錄的是引數以及在函式體中聲名的變數。

全域性名稱空間:記錄的是整個py檔案中的變數和函式。

內建名稱空間:任何模任何模組均可訪問它,它存放著內建的函式和異常

注意:函式名本質就是記憶體地址(id)來呼叫方法

2.訪問名稱空間的內容:

使用locals()內建函式檢視區域性名稱空間的內容

使用globals()內建函式來檢視全域性名稱空間的內容

注意:如果locals()沒有放在函式體中,而是放在全域性名稱空間中,作用和globals()一樣。

c = 30


def func():
    a = 10
    b = 20
    print(locals())  # 訪問區域性名稱空間


func()
print(globals())  # 訪問全域性名稱空間
print(locals())  # 放在函式體外和globs()作用一樣。

輸出結果:

 

 

 

二.名稱空間的載入和查詢順序 :

1.載入順序:

內建名稱空間(程式執行前載入)----->全域性名稱空間(程式執行中:從上到下載入)----->區域性名稱空間(程式執行中:呼叫時才載入)當函式返回結果 或 丟擲異常時,被刪除。每一個遞迴呼叫的函式都擁有自己的名稱空間。

2.查詢順序:

當使用某個變數的時候,先從區域性名稱空間中找,如果能找到則停止搜尋,如果找不到在去全域性名稱空間中查詢,如果找到則停止搜尋,如果找不到則到內建名稱空間中查詢,如果找不到則報錯。

注意:自己的變數名不要和內建的變數名相同,否則無法使用內建函式的功能

例如:

輸出結果:

報錯

 

三.作用域:

1.定義:變數的可用範圍。

2.根據變數位置不同可分為4類:

區域性作用域----->函式體中宣告的變數。

巢狀作用域----->巢狀函式中外城函式體宣告的變數

全域性作用域----->py檔案中宣告的變數

內建作用域----->python提供的變數(函式)

a = 20  # 聲明瞭全域性作用域,一次可以在全域性使用


def func():
    b = 10  # 聲明瞭區域性作用域,只能在區域性使用
    print(b)
    print(a)


func()
print(a)
# print(b)  報錯,因為b變量出了自己作用域的範圍。

輸出結果:10

                     20

                     20

輸出結果:10

                    20

                    30

四.global和nonlocal關鍵字:

1.global:

global關鍵字可以將區域性變數變成一個全域性變數。

a = 10
print(id(a))


def func():
    global a  # 變成全域性變數
    print(a)
    print(id(a))
    a = 20  # 修改全域性變數的值
    print(a)
    print(id(a))


func()
print(a)

輸出結果:

2.nonlocals:

nonlocal關鍵字可以修改外層(非全域性)變數。

def outter():
    name = 'zs'

    def inner():
        nonlocal name  # 和outter中的那麼是同一個變數
        name = '趙四'
        print(name)
        print(id(name))

    inner()
    print(name)
    print(id(name))


outter()

輸出結果:

 

五.遞迴函式:

1.定義:如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。

在使用遞迴時,需要注意以下幾點:

l(1).自己呼叫自己。

l(2).必須有一個明確的遞迴結束條件,稱為遞迴出口。

2.練習:

# 讓控制檯輸出3,2,1:

輸出結果:3

                    2

                    1

 

#  計算1到10的乘階:例如 1*2*3*4*5...*10。

def digui(n):
    if n == 1:       # 判斷條件,遞迴的出口。
        return 1
    ret = digui(n - 1) # 自己呼叫自己
    return n * ret


num = digui(10)
print(num)

輸出結果:3628800

 

#     查詢數字:通過程式查詢輸入的number值。

提示:二分查詢法:

def search_num(number, start, end):
    if number == start:
        return start
    else:
        middle = (start + end) // 2  # 獲取中間值
        if middle >= number:
            return search_num(number, start, middle)
        else:
            return search_num(number, middle, end)


ret = search_num(4, 2, 8)
print(ret)

 

六.內建函式:

abs() 函式 max() 函式、map() 函式、filter() 函式,zip() 函式

1.abs()函式:求數字的絕對值

a = -10

print(abs(a))

輸出結果:10

2.max():

max(iterable, key, default) 求迭代器的最大值,

其中iterable 為迭代器,max會for i in … 遍歷一遍這個迭代器,

然後將迭代器的每一個返回值當做引數傳給key=func 中的func(一般用lambda表示式定義) ,然後將func的執行結果傳給key,然後以key為標準進行大小的判斷。

練習:

#  根據name和price 返回最大的資訊

 

lst = [{'name': 'egon', 'price': 100},

    {'name': 'rdw', 'price': 666},

    {'name': 'zat', 'price': 1}]

lst = [
    {'name': 'egon', 'price': 100},
    {'name': 'rdw', 'price': 666},
    {'name': 'zat', 'price': 1}]
# name返回的最大值
def max_name(dic):
    return dic['name']          # 返回字典對應的值

ret = max(lst,key=max_name)     # 指定比較內容
print(ret)


#  price 返回的最大值:
def max_price(dic):
    return dic['price']

ret = max(lst,key=max_price)
print(ret)

輸出結果:{'name': 'zat', 'price': 1}
                    {'name': 'rdw', 'price': 666}

3.map():

有兩個引數,第一個引數是一個函式,第二個引數是可迭代的內容。

函式會依次作用在可迭代內容的每一個元素上進行計算,然後返回一個新的可迭代內容。

 

練習:求lst = [1,2,3]中每一個元素平方的值

lst = [1, 2, 3]


def square(num):
    num1 = num * num
    return num1


ret = map(square, lst)  # 迭代器
for i in ret:  # 迭代器需要for迴圈遍歷取值
    print(i)

4.filter():

filter() 函式用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。

該接收兩個引數,第一個為函式,第二個為序列,序列的每個元素作為引數傳遞給函式進判,

然後返回 True 或 False,最後將返回 True 的元素放到新列表中。

 

練習:

過濾出列表所有的奇數:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def ood_num(num):
    if num % 2 == 1:  # 判斷是否是奇數
        return num


ret = filter(ood_num, lst)
print(list(ret))  # 將迭代器強制轉化成列表

輸出結果:[ 1,3,5,7,9 ]

 

5.zip()

zip函式接受任意多個可迭代物件作為引數,將物件中對應的元素打包成一個tuple,

然後返回一個可迭代的zip物件.這個可迭代物件可以使用迴圈的方式列出其元素

若多個可迭代物件的長度不一致,則所返回的列表與長度最短的可迭代物件相同。

a = [1, 2, 3]
b = ['a', 'b', 'c']
ret = zip(a, b)
for i in ret:
    print(i)

----------------------------------------------------------------------------------

tu1 = (('a'), ('b'))
tu2 = (('c'), ('d'), ('e'))
ret = zip(tu1, tu2)
for i in ret:
    print(i)

輸出結果:

(1, 'a')
(2, 'b')
(3, 'c')
('a', 'c')
('b', 'd')