函數進階 函數的作用域 作用域又可以被稱為命名空間,指變數起作用的範圍。Python變數作用域可以分為四種,分別為局部作用域、嵌套作用域、全局作用域、內置作用域。 | 作用域 | 英文 | | | | | 局部作用域 | Local | | 嵌套作用域 | Enclosing | | 全局作用域 | ...
函數進階
函數的作用域
作用域又可以被稱為命名空間,指變數起作用的範圍。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