1. 程式人生 > >Python學習日記day10

Python學習日記day10

1.2 命名 get input div 原則 ret 同名 傳值

1,參數陷阱

如果默認參數的只是一個可變數據類型,那麽每一次調用的時候,如果不傳值就共用這個數據類型的資源。

2,三元運算

c=a if a>b else b#如果a》b返回a,否則,返回b 變量 =條件返回True的結果 if 條件 else 條件返回False的結果 必須要有結果 必須要有if和else 只能是簡單的情況 def func(a,b): a if a>b else b print(func(5,1))

3,命名空間與作用域

3.1命名空間的種類

命名空間有三種 內置、全局與局部 3.1.1#內置命名空間-----python解釋器 #就是python解釋器一啟動就可以使用的名字存儲在內置命名空間中 #內置的名字在啟動解釋器的時候被加載進內存裏 3.1.2#全局命名空間----我們寫的代碼但不是函數中的代碼 #是在程序從上到下被執行的過程中一次被執行進內存的 #放置了我們設置的所有變量名和函數名 3.1.3#局部命名空間----函數 #就是函數內部定義的名字(定義在函數裏的名字) #當調用函數的時候在會產生這個名稱空間,隨著函數執行的結束,這個命名空間就又消失了。  #在局部:可以使用全局、也可以使用內置命名空間中的名字   #在全局:可以使用內置命名空間中的名字,但不能使用局部命名空間中的名字   #在內置:不能使用局部和全局的名字的  3.1.4內置命名空間、全局命名空間與局部命名空間的關系: 技術分享圖片

依賴倒置原則:上層模塊應該依賴下層模塊,不能反向依賴

在正常情況下,直接使用內置的名字。 當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字。 當只有的時候,就不會找上一級要 如果自己沒有就找上一級要 如果上一級沒有,就再向上一級要 多個函數擁有多個獨立的局部明明空間,不互相共享
def input():
    print(in input now)
def func():
    input()

func()

4,作用域有兩種

  全局作用域與局部作用域

  #全局作用域--->作用在全局----內置和全局名字空間中的名字都屬於全局作用域--globals() #局部作用域--->作用在局部----函數(局部名字空間中的名字屬於局部作用域-----locals()
a =1
def
func(): global a a+=1 func() print(a)
#對於不可變數據類型在局部可以查看全局作用域中的變量,但是不能直接修改 #如果想要修改需要在程序的一開始添加global聲明 #如果在一個局部內(函數)內聲明了一個global變量,這個變量在局部的所有操作將對全局變量有效
# a = 1
# b = 2
# def func():
#     x = ‘aaa‘
#     y = ‘bbb‘
#     print(locals())
#     print(globals())
#
# func()
# print(globals())
#
print(locals()) #本地的--->在函數體的外部使用locals,作用與globals是相同的
#globals 永遠打印全局的名字 #locals輸出什麽 根據locals所以在的位置
a =1
b =2
print(globals())
print(locals())

5,函數的嵌套調用

def max(a,b)
    return a if a>b else b
def the_max(x,y,z):
    c =max(x,y)
    return max(c,z)
print(the_max(1,2,3))

在一個函數的函數體內調用另一個函數叫做函數的嵌套調用

6,函數的嵌套定義

內部函數可以使用外部函數的變量叫做函數的嵌套

def outer():
    def inner():
        print(inner)
        def inner2():
            a+=1 #不可變數據類型的修改
            print(a,b)
            print(inner2)
        inner2()
    inner()
outer()

技術分享圖片

def outer():
    a =1
    def inner():
        b =2
        print(a)
        print(inner)
        def inner2():
            a+=1
            print(inner2)
        inner2()
    inner()
    print(**a**:,a)
outer()

6.1nonlocal a #聲明了一個上面第一層局部變量
a =1
def outer():
    a=1
    def inner():
        b=2
        print(a)
        print(inner)
        def inner2():
            nonlocal a
            a+=1
        inner2()
    inner()
    print(**a**:,a)
outer()
print(全局:,a)
#nonlocal 只能用於局部變量,找上層中離當前函數最近一層的局部變量 #生命了nonlocal的內部函數的變量修改會影響到離當前函數最近一層的局部變量 對全局無效 對局部也只對最近的一層有影響

7,作用域鏈

在內部函數適用變量的時候,是從小局部到大局部到全局到內置名字的過程,一級一級往上找,找到最近的一個就使用一一作用域鏈
a =0
def outer():
    def inner():
        def inner2():
            print(a)
        inner2()
    inner()
outer()
函數名的本質--------第一類對象 7.1函數名可以賦值
def func():
  print(123)
func2 =func
func2()

7.2數名可以作為容器類型的元素
def func():
    print(123)
func()  #函數名就是內存地址
func2 = func  #函數名可以賦值
func2()
l = [func,func2] #函數名可以作為容器類型的元素
print(l)
for i in l:
     i()
7.3函數名可以作為函數的參數和返回值:
def func():
    print(123)
def wahaha(f)
    f()
wahaha(func)

7.4函數名可以作為函數的返回值
def func():
    print(123)
def wahaha(f)
    f()
    return f
qqxing =wahaha(func)
qqxing()

8,閉包:嵌套函數,且內部函數要調用外部函數的變量

def outer():
    a =1
    def inner():#--->inner是一個閉包
        print(a)
    print(inner._closure_)
outer
常見的閉包函數形式
def outer():
    a =1
    def inner():#--->inner是一個閉包
        print(a)
    return inner
outer
inn =outer()
inn()

在一個函數的外部調用內部的函數 閉包函數應用:
def get_url(): 
   urlopen(http://www.xiaohua100.cn/index.html).read() 
   def inner():
        ret = urlopen(url)
        print(ret)
    return inner
get_func =get_url()
get_func()

Python學習日記day10