python基礎——函式二
目錄
一.名稱空間和訪問名稱空間中的內容:
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')