1. 程式人生 > >python3基礎(六)-變數

python3基礎(六)-變數

1、區域性變數

在函式裡面定義的變數為區域性變數,它只能在該函式當中使用(它的作用範圍在該函式裡面),出了該函式就不起作用了。如果區域性變數和全域性變數的名字是一樣的,則在函式內會優先使用區域性變數。

2、全域性變數

在函式體外面定義的變數為全域性變數,可以在後面的程式碼中使用。

3、str(list)函式

names=['zhan', 'tao', 'lishi']
print("names的值為%s"%names)    #前面print使用的變數為基礎變數,而這裡為什麼可以使用陣列呢,其實是系統自動幫我們做了些事情,比如在這個地方系統自動呼叫的函式將陣列轉換成了字串str(names)

4、函式多個返回值

def test():
    a=1
    b=2
    return a,b    #函式是可以返回多個值的,也可以返回一個數組型別的值:return [a,b]
x,y=test()    #可以使用兩個變數來接它裡面返回的兩個值。x=1,y=2
x=test()    #也可以使用一個變數來接它裡面返回的兩個值,只不過返回的值變成了元組(1,2),也可以使用一個值來接它返回的陣列。

5、預設引數值

def test(x, y, z=10):    #z=10則是預設引數,預設值為10
print(x, y, z)

什麼是預設引數?函式裡面定義的引數,一般呼叫時是必須要傳入值的。而預設引數,則是引數含有預設值,而呼叫時不一定要對此引數傳值。當呼叫此函式時,不傳值時預設引數則會使用預設值,當傳入值時,預設引數則會使用新傳入的值。

6、不定長引數

def test(x, y, *args):    #*args為匿名引數,也就是不帶名字的
    print(x, y)
    print(args)
    sum = x + y
    for i in args:
        sum+=i
    print(sum)
test(1,2,3,4,5,6,7,8)
結果:x=1,y=2,args=(3,4,5,6,7,8)

def test2(x, *args,  **kwargs):    #*kwargs為帶名字的引數
    print(x)
    print(args)
    print(kwargs)
    sum = x + y
    for i in args:
        sum+=i
    for i in kwargs.values():    #既然kwargs是字典,而我們所需要的只是字典的值
        sum+=i
    print(sum)
test2(1,2,3, num1=4, num2=5)    #此處如果不指定名字,那麼4和5也會被傳給匿名引數
結果:x=1,args=(2,3),kwargs={'num1' : '4', 'num2' : '5'}    #從結果可以看出kwargs引數返回的是一個字典

7、集合的拆包

nums=[2,3]
num2={"num1":4, "num2":5}
test2(1, *nums, **nums2)    #打印出來的結果,跟test2(1,2,3, num1=4, num2=5)這種傳參方法所得到的結果是一樣的。本來nums和num2是全域性變數名,但在傳入的引數前加上*或**號,是為了表明傳入的是匿名引數,還是帶名字的引數。

8、小知識

1)如果在全域性變數定義了一個age=30。如果在某個函式當中,也使用賦值運算子直接age=30,則是代表在此函式裡面重新定義了一個區域性變數為age,而不一定是修改全域性變數。(這塊是跟java不同的,java裡面是直接修改全域性變數)
2)如果在賦值運算前加上global age,則代表下一行是修改變數值。
3)如果全域性變數是可變型別的變數,則可以在呼叫它的函式裡面直接通過變數本身的函式修改變數的值。但是需要重新賦值也就是修改引用,仍然要加global age提前申明,否則仍然是在呼叫函式裡面新建一個新的區域性變數。list或dict。
4)如果全域性變數是不可變型別是絕對不能修改它的值的。比如連續定義兩個全域性變數age=100,age=200,這並不是把age的值改成了200,而是在記憶體當中存在兩個堆記憶體塊,一個堆記憶體塊存的值為100,另一個堆記憶體塊存的值為200,只是修改了變數age的引用而已。而如果age=200是在函式當中,那麼即不可以修改全域性變數age的值,也不能修改全域性變數age的引用,而是重新定義了一個新的區域性變數age。除非在上一行,加上global age,也僅僅是修改引用而已。
5)函式定義時,預設引數不能放在預設引數之前定義。意思就是帶有預設值的形式引數,必須放在沒有預設值的的引數後面定義。
6)函式裡面變數的變化,要注意可變變數與不可變變數的區別。比如str.replace("", "")函式是不會導致str本身的值有任何變化的,而是建立一個新的字串,所以在呼叫此函式時需要定義一個變數來接它的結果。

作者:滄水巫雲
部落格:http://blog.csdn.NET/amir_zt/
以上原創,轉載請註明出處,謝謝。
https://blog.csdn.net/amir_zt/article/details/83011931