天天看點

6.函數參數

1.預設參數: 預設參數

def 函數名(形參1, 形參2=預設值):
  ...      

2.關鍵字參數

def sum(a, b, c):
    print(a)
    print(b)
    print(c)
    print(a + b + c)      

3.可變參數: 不定長參數

def print_arguments0():
    print()


def print_arguments1(a):
    print(a)


def print_arguments2(a, b):
    print(a)
    print(b)


def print_arguments3(a, b, c):
    print(a)
    print(b)
    print(c)


"""
可變參數:
    在形參前面加了 一個 *,這個參數就叫可變參數(不定長參數).
    表示0個或者任意多個形參.
特點:
    1. 前面 有一個 *
    2. 表示0個或者任意多個形參
    
好處:
    1.可以擴充函數的功能,更加通用.
    
"""
def print_arguments(* args):
    # print(* args) # 解包:10 20
    # print(args) # (10, 20)
    # print(type(args)) # <class 'tuple'>
    for e in args:
        print(e)


# 如果函數的形參是一個可變參數,當調用函數時,python解釋器會自動把傳遞的
# 實參打包成一個元組,然後把元組傳遞給可變參數.

# print_arguments()
# print_arguments(10)
print_arguments(10, 20)
# print_arguments(10, 20, 30)      

4.參數的混合使用

def sum_nums_3(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)


sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)      

5.在實參前加星

def func1(* a, ** b):
    print(a) # ((10, 20), {'m': 30, 'n': 40})
    print(b) # {}


def func2(* args, ** kwargs):
    print(args) # (10, 20)
    print(kwargs) # {'m': 30, 'n': 40}
    # 調用func1函數
    # func1(args, kwargs)
    # args是一個元組, kwargs是一個字典
    # * 元組: 對元組解包,解成 元素1 元素2
    # ** 字典: 對字典解包,解成 m=30, n=40形式的
    func1(* args, ** kwargs) # func1(10, 20, m=30, n=40)
    # func2(10, 20, m=30, n=40)


func2(10, 20, m=30, n=40)      

6.組包和解包

組包:
  把0或者多個資料 放到一個 容器中.
  
  元組名 = 資料1,資料2      

解包:

把容器中的資料取出來.

7.利用自動解包-交換兩個變量的值

a,b = b,a      

8.引用1-引用的概念和特點

引用: 位址.
引用: 使用.

特點:
  如果兩個變量的引用相同,對應的資料一定相同.
  如果兩個變量對應的資料相同,引用不一定相同.      

9.引用2-數字類型和字元串類型資料的緩存區

小整數池:-5-256
短字元串池:長度短于20的字元串
大整數或者長字元串會在第一次進行緩存      

10.引用3-變量引用的變化

改變變量的引用:
  改變它對應的位址,賦一個新的值.      

11.可變類型和不可變類型

不可變類型:

  如果改變了該類型的資料的值,位址 也發生了變化, 這種類型的資料,是不可變類型的資料.
  常見類型:
    int, float,bool, str, tuple
  
可變類型:

  如果改變了該類型的資料的值,位址 沒有 發生了變化, 這種類型的資料,是可變類型的資料.
  常見類型:
    list,dict,set      

12.引用4-引用作為函數的實參時對可變類型,不可變類型變量的影響

"""
python中隻有引用傳遞沒有值傳遞.
也就是說在調用函數傳遞實參時,給形參傳遞的是實參的位址,而不是具體的資料值.
"""
# def sum(a, b):
#     print(a + b)
#
#
# sum(10, 20)


def print_list(list2=[]):
    list2.append(2)
    print(list2)
    print(id(list2))


# list1 = [10, 20]
# print(id(list1))
# print_list(list1)
list1 = [10, 20]
print(id(list1))
print_list()
print(list1)      
"""
    a += 1
    a = a + 1

這兩種寫法對應 不可變類型的 資料,是沒有差別的.
"""
a = 10
print(id(10))
a += 1
print(a)
print(id(a))

str1 = "hello"
print(id(str1))

str1 += " python"
print(str1)
print(id(str1))

print("-----------------------")

list1 = [10, 20]
print(id(list1))
# 隻是把第二個清單中的元素放到第一個清單中,第一個清單的位址沒有變,沒有産生第三個清單
# list1 += [30, 40]
# print(list1)
# print(id(list1))

# 是把兩個清單中的元素都放到第三個清單中,産生了第三個清單,把第三個清單指派給了list1
list1 = list1 + [30, 40]
print(list1)
print(id(list1))