函式進階
函式的作用域
作用域又可以被稱為命名空間,指變數起作用的范圍,Python變數作用域可以分為四種,分別為區域作用域、嵌套作用域、全域作用域、內置作用域,
| 作用域 | 英文 |
|---|---|
| 區域作用域 | Local |
| 嵌套作用域 | Enclosing |
| 全域作用域 | Global |
| 內置作用域 | Buiit-in |
內建作用域是特質python api內置的一些操作,例如 len 、max等函式,無需宣告就可使用,
變數作用域
一個程式的所有的變數并不是在哪個位置都可以訪問的,訪問權限決定于這個變數是在哪里賦值的,變數的作用域決定了在哪一部分程式你可以訪問哪個特定的變數名稱,兩種最基本的變數作用域如下:
- 全域變數:定義在函式內部的變數擁有一個區域作用域,定義在函式外的擁有全域作用域,
- 區域變數:區域變數只能在其被宣告的函式內部訪問,而全域變數可以在整個程式范圍內訪問,
x = 2
def func():
x = 3 # 區域變數
return x
result = func()
print(result) # 3
print(x) # 2
當我們在代碼里使用變數時,Python創建物件,改變物件或查找物件都是在一個所謂命名空間下進行的(一個保存變數名的地方),而函式除了打包代碼之外,還定義了一個新的變數空間,一個函式所有的變數,都與函式的命名空間相關聯:
- def 內定義的變數名能夠被 def內的代碼使用,不能在函式外部參考這樣的變數名
- def之中的變數名與def之外的變數名并不沖突
也就是說:
- 如果一個變數在def內被賦值,它就被定義在這個函式之內
- 如果在def之外賦值,它就是整個檔案全域的
回到上面的那個例子:
x = 2
def func(x):
x = 3
"""
盡管這兩個變數名都是x,但是他們作用域(命名空間)可以把他們區別開,
作用域(命名空間)有助于防止程式之間變數名的沖突,而且,有助于函式成為更加獨立的單元,
在Python中,函式定義了一個函式本地內的作用域,
而像x = 2這樣賦值陳述句定義了一個全域作用域(模塊級別的變數,使用范圍僅限于單個檔案),
而像x = 3這樣賦值陳述句定義了一個區域作用域(范圍僅限于函式內部),
"""
global關鍵字
函式中修改不了全域作用域的變數如需修改,加global關鍵字,宣告變數為全域變數
y = 10
def func():
global y
y = 5
print('y1 =', y)
func() # y1 = 5
print('y2 =', y) # y2 = 5
"""
函式體中使用了global關鍵字,宣告y為全域變數,故在函式中就改變了y的值
若函式體中沒有global y 陳述句,最后的結果就是y1 = 5,y2 = 10 4;這就跟上面的那個案例相同了
"""
nonlocal關鍵字
# E(enclosing):嵌套的父級函式的區域作用域
def mytest1():
b = 6 # 區域變數 相對而言 我們的b是函式mytest2的全域變數
def mytest2():
#
nonlocal b # nonlocal 關鍵字用于在嵌套函式內部使用變數 了解即可 用的時候比較少
b = 7 # 重新開辟了記憶體空間 注釋掉直接列印b
print(b, id(b))
mytest2()
print(b, id(b))
mytest1()
"""
7 1440395648
7 1440395648
"""
函式作用域的優先級

高階函式
概念與呼叫
高階函式:一個函式可以作為引數傳給另外一個函式,或者一個函式的回傳值為另外一個函式(若回傳值為該函式本身,則為遞回),滿足其一則為高階函式,
- 一個函式的函式名作為引數傳給另外一個函式
# 頻繁的使用 需要其他的功能結合使用
def func():
print("定義一個普通函式")
def high_level(func):
print("定義一個高階函式") # 此函式的功能
# 在函式內部,通過傳入的函式引數呼叫
func() # 呼叫我傳入的函式名的函式
high_level(func)
"""
定義一個高階函式
定義一個普通函式
"""
- 一個函式回傳值(return)為另外一個函式(回傳為自己,則為遞回)
def func():
print("定義一個普通函式")
def high_level(func):
print("定義一個高階函式")
return func # high_level
# return func() 這個是直接回傳函式呼叫,遞回函式就是如此
res = high_level(func)
# 高階函式回傳函式之后在呼叫func函式
res()
"""
定義一個高階函式
定義一個普通函式
"""
遞回
- 函式內部自己呼叫自己
- 必須要有出口
# 列印1-9(range)
def func(start, end, step=1):
print(start)
if start >= end:
return # 結束函式運行,停止遞回
func(start + step, end, step)
func(1, 9)
3、內置高階函式
1)lambda函式
- 匿名函式
- 優點:節省記憶體空間,優化代碼
# lambda函式
# 當函式里面只有一行代碼時,可以轉換為匿名函式
# 實際中,只使用一次,不需要考慮函式的名字,只需要功能
# lambda 傳入的引數:回傳的資料
def add(a, b):
return a + b
print(add(1, 2))
print((lambda a, b: a + b)(1, 2))
add1 = (lambda a, b: a + b) # 定義名字,重復使用
print(add1(2, 2))
print(add1(2, 3))
- lamada引數實體
import random
# 無引數
sdds = lambda: random.random()
sdds()
# 一個引數
fun1 = lambda x: x
print(fun1('hello python'))
# 默認引數 (預設引數)
fun2 = lambda a, b, c=100: a + b + c
print(fun2(10,19,1000))
# 可變引數之args
fun3 = lambda *args: args
print(fun3((1,2,3,4,5)))
# 可變引數之kwargs
fun4 = lambda **kwargs: kwargs
print(fun4(name='yueyue',age=18,height='178cm'))
# 帶判斷的lambda運算式
asd = lambda x: x if (x > 10) else 10
print(asd(5))
#### 它是以下帶有def和return 關鍵字的普通函式的更簡單版本:
def fun(x):
if x > 10:
return x
else:
return 10
print(fun(5))
- 串列中字典資料排序
# 串列中的字典排序
# 需求:假設我們需要對字典中的年齡進行排序
user_list = [
{"name": 'zhangsan1', 'age': 18},
{"name": 'lisi1', "age": 19},
{"name": 'wangwu1', "age": 17}
]
def getAge(element):
return element['age']
# 傳遞給key引數的是一個函式,它指定可迭代物件中的每一個元素來按照該函式進行排序
user_list.sort(key=getAge,reverse=True)
print(user_list)
# 我們需要使用匿名函式,使用sort函式中的key這個引數,來指定字典比大小的方法
# reverse引數控制升序與降序排列
user_list.sort(key=lambda x:x['age'],reverse=True)
print(user_list)
2)map函式
- 語法:map(function, iterable, ...)
- 引數:function —— 函式;iterable —— 可迭代物件
- 作用:通過將指定的function函式依次作用在給定序列iterable中的每一個元素上,得到一個新的list并回傳,注意,map不改變原list,而是回傳一個新list,
# map函式 映射
# 串列資料轉為字串
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda i: str(i), list1))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']
print(list(map(str, list1))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']
3)reduce函式
- reduce() 函式來自 functools 模塊,使用 reduce() 函式,需要在代碼開始時使用以下陳述句匯入 functools 模塊:
from functools import reduce
關于模塊(module)的知識和使用方法后續會進行深入學習,
- 作用:先從串列(或序列)中取出2個元素執行指定函式,并將輸出結果與第3個元素傳入函式,輸出結果再與第4個元素傳入函式,…,以此類推,直到串列每個元素都取完,
from functools import reduce # 匯入內置reduce函式
def fn(x, y):
return x + y
res = reduce(fn, [1, 3, 5, 7, 9])
print(res) # 25
4)filter函式
- 語法:reduce(function, iterable)
- 引數:function —— 函式;iterable —— 可迭代物件
- 作用:filter函式也是接收一個函式和一個序列的高階函式,其主要功能是過濾,
# 在一個list中,刪掉偶數,只保留奇數
def is_odd(n):
return n % 2 == 1
print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # <filter object at 0x00000193E06AE860>
print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))) # [1, 5, 9, 15]
學員管理系統
這個建議自行去寫一下,除了這個系統,還有圖書館管理系統,宿舍管理系統等,網路上都有許多教程,換湯不換藥的,有需要可以聯系,
本文來自博客園,作者:大-鍋,轉載請注明原文鏈接:https://www.cnblogs.com/daguo118/p/17314962.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549958.html
標籤:Python
下一篇:在Django+Vue3+GraphQL的Blog例子代碼中引入Element-Plus UI Framework
