Python學習之路基礎篇--10Python基礎,函數進階

1 命名空間git

  對於Python 來講命名空間一共有三種閉包

  1 內置命名空間 —— Python 解釋器函數

    就是Python 解釋器一啓動就可使用的名字,儲存在內置命名空間中。內置的名字在啓動解釋器的時候被加載進內存裏spa

  2 全局命名空間 —— 咱們所命名的,但不是函數中的代碼code

    是在程序從上到下被執行的過程當中依次加載進內存中的,放置了咱們所設置的全部變量名和函數名對象

  3 局部命名空間 —— 函數 blog

    就是函數內部定義的名字,當調用函數時,纔會產生這個名稱空間,隨着函數執行的結束,這個命名空間又消失索引

  PS:內存

    1 在局部中可使用全局、內置命名空間中的名字;在全局中可使用內置命名空間的名字,但不能使用局部中定義的名字;在內置中不能使用局部和全局的名字作用域

    2 正常狀況下直接使用內置的名字,當在全局定義了和內置名字空間中同名的名字時,會使用全局的名字;本身有名字就用本身的,沒有就一級級身上找,若是內置中尚未,就會報錯;多個函數擁有多個獨立的局部名字空間,不互相共享

 

2 函數名

def func():
    pass

  其中func 是函數的內存地址,函數名加(),是函數的調用,能夠類比爲:函數的內存地址() = 函數的調用

  函數名就是內存地址;函數名能夠賦值;函數名能夠做爲容器類型(元組、列表和字典)的元素;函數名能夠做爲函數的返回值;函數名能夠做爲參數

 

3 函數的做用域

  函數的做用域能夠分爲兩種

  全局做用域 —— 做用在全局 —— 內置和全局名字空間中的名字都屬於全局做用域 —— globals()

  局部做用域 —— 做用在局部 —— 函數(局部名字空間中的名字屬於局部做用域)—— locals()

 

  對於不可變的數據類型來講,局部能夠查看全局做用域中的變量,可是不能直接修改,若是想修改,須要在程序的一開始添加 global 聲名,若是在一個局部(函數)內聲名一個global 變量,那麼這個變量在局部的全部操做將對全局的變量有效

a = 1
def func():
    global a
    a += 1
    print(a)
func()

  對於 globals() 和 loclas() 方法

a = 1
b = 2
def func():
    x = 'aaa'
    y = 'bbb'
    print(locals())    #1 打印當前
    print(globals())    #2 打印全局
func()
print(globals())    #3 打印全局
print(locals())    #4 打印當前

  二者打印的是,以字典的形式打印出命名。二、三、4 打印的內容一致,1 打印的是函數內命名的狀況

 

4 函數的嵌套

  定義:就是內部函數可使用外部函數的變量

a = 1
def func1():
    a = 2
    def func2():
        nonlocal a #聲明瞭一個上面第一層局部變量
        a += 1  # 對不可變數據類型進行了修改  
        print(a)
    func2()
    print(a)
func1()
print(a)

  nocolal 只能用於局部變量,找上層中離當前函數最近一層的局部變量;聲明 noncolal 的內部函數的變量修改會影響到離當前函數最近一層的局部變量;對全局無效,對局部也只是最近的一層有影響。

 

5 閉包

  閉包就是內部函數調用外部函數的變量

def outer():
    a = 1
    def innner():
        print(a)
    return inner
inn = outer()
inn()

  目的是保護函數內定義的值,而且節省內存空間,不用每次都定義一個a,直接用便可~

 

  來個三元運算

# 取兩個數的最大值
def func(a,b):
    return a if a > b else b
print(func(3, 5))

 

6 小做業

 # 1 寫函數,接收 n 個數字,求這些參數數字的和
 def sun_func(*args):
     total = 0
     for i in args:
         total += i
     return total
# 2 讀代碼,回答:代碼中打印出來的值 a、b 和 c 分別是什麼?爲何?
a = 10
b = 20
def test5(a, b):
    print(a, b)
c = test5(b, a)
print(c)
# 得出的結果爲:
# 20 10 
# None 
# 3 寫函數,檢查獲取傳入列表或元組的對象的全部奇數位索引對應的元素,並將其做爲新的列表返回給調用者
def func(lis):
    return lis[1::2]
print(func([1,2,3,4,5,6,]))
# 4 寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大於5
def func(x):
    return len(x) > 5
print(func('dfs'))
print(func([1,2,3,4,5,6,]))
print(func((1,2,3,4,5,)))
# 5 寫函數,檢查用戶傳入列表的長度是否大於2,若是大於,那麼僅保留前兩個長度的內容,並將新內容返回給調用者
def func(lis):return lis[:2] # 若是列表長度不夠的話,是不會報錯的
# 6 寫函數,計算傳入字符串中,數字、字母、空格以及其它 的個數 ,並返回結果
def func(s):
    dic = {'n_digist':0,'n_alphabet':0,'n_blank':0,'n_other':0}
    for i  in s:
        if i.isdigit():
            dic['n_digist'] += 1
        elif i.isalpha():
            dic['n_alphabet'] += 1
        elif i.isspace():
            dic['n_blank'] += 1
        else:dic['n_other'] += 1
    return dic
print(func('skjdfhwhihsdfjkh389fhsfhksf  [fahh=-=-'))
相關文章
相關標籤/搜索