1. 程式人生 > 實用技巧 >用python爬蟲方式:刷文章閱讀量,挺高你的文章訪問量

用python爬蟲方式:刷文章閱讀量,挺高你的文章訪問量

函式的引數

1. 形參和實參

1.1 形參

形參:在定義函式階段定義的引數叫做形式引數,簡稱形參,相當於變數名

函式在定義階段括號內指定的變數名

def func(x):  # x就是形參
    print(x)

1.2 實參

實參:在呼叫函式階段傳入的值稱之為實際引數,簡稱實參,相當於變數值,值可以是常量、變數、表示式或三者

的組合

函式在呼叫階段括號內傳入的值

def func(name):
    print(f'我的名字是{name}')
    
func('tom')  # 'tom'就是實參 

1.3 形參和實參的關係

在呼叫階段,實參(變數值)會繫結給形參(變數名),繫結不是目的,目的是在函式體中使用。函式呼叫結束

後,這種繫結關係就會解除,所以你無法在函式體外使用。

2. 三種引數

2.1 位置引數

位置引數:按照從左到右的順序依次定義的引數稱之為位置引數

位置形參 : 在函式定義階段,按照從左到右的順序直接定義的"變數名"

特點 : 必須傳值,多一個不行,少一個也不行

def func(x,y,z): # x,y,z 三個位置形參
    return x + y + z

位置實參 : 在函式呼叫階段,按照從左到右的順序依次傳入的值

特點 : 按照順序與形參一 一對應

def func(x,y,z):
    return x + y + z

func(1,2,3) # 1,2,3 三個位置實參,依次傳給x,y,z

2.2 關鍵字引數

關鍵字實參:在函式呼叫階段,按照key=value的形式傳入的值

特點:指名道姓給某個形參傳值,可以完全不按照順序

混合使用:

  • 位置實參必須放在關鍵字實參前面
  • 不能為同一個形參重複傳值
def foo(x,y):
    return x + y

foo(1,y=2)
foo(y=2,1) # 報錯

foo(1,y=2,x=3) # 報錯
foo(1,2,x=3,y=4) # 報錯

2.3 預設值引數

預設形參:在函式定義階段,就已經被賦值的形參,稱之為預設引數

特點:在函式定義階段就已經被賦值,意味著在呼叫階段可以不用為其賦值,也可以賦值改變預設值

def func(x,y=1):
    return x+y

func(1)
func(1,2)
func(x=1,y=1)
func(10,y=20)

混合使用:

  • 位置引數必須在預設值引數前面
def func(x,y=100):
    return x + y

強調:

  • 預設引數的值是在函式定義的時候就別賦予的,準確地說被賦予的是值的記憶體地址

  • 提一嘴 : 在python中所有值的傳遞都是記憶體地址的傳遞,有的人也說python中都是引用傳遞

    m = 99
    def func(x.y=m): # y=>99的記憶體地址
        print(x,y)
        
    m = 100000    
    func(1)  # 列印1 99
    
    m = [1111,]
    def func(x.y=m): # y=>列表[1111,]的記憶體地址
        print(x,y)
        
    m.append(2222)
    func(1)  # 列印 1 [1111,222]
    
    # 雖然預設值可以可以被指定為任意型別,但是不推薦使用可變型別
    # 函式最理想的狀態:函式的呼叫只跟函式本身有關,不受外界程式碼的影響。
    

2.4 形參如何定義

  • 位置形參:當每次函式呼叫傳進來的引數都是不一樣的,但是又是必須傳入的時候
  • 預設值引數:當每次函式呼叫傳進來的引數大都是不變的,應該設為預設值引數
# 註冊小示例:
def register(name,age,sex):
    print(name,age,sex)
    
register('小明',20,'男')
register('小紅',19,'女')
register('小強',22,'男')
register('小亮',23,'男')

# 這個時候發現性別大多數都是男,於是你可以在函式定義的時候設定一個預設值引數,即sex='男'
def register1(name,age,sex='男'):
    print(name,age,sex)
    
register1('小明',20)
register1('小紅',19,'女')
register1('小強',22)
register1('小亮',23) 
# 當遇到女同學的時候,才傳入sex的值,預設情況下我們把性別設定成男

3. 可變長度引數(*與**)

可變長度指的是在呼叫函式時,傳入的值(實參)的個數不固定

而實參是用來為形參賦值的,所以對應著,針對溢位的實參必須有對應的形參來接收

3.1 可變長度的位置引數

*形參名:用來接收溢位的位置實參 , 溢位的位置實參會被*儲存成元組的格式然後賦值緊跟其後打的形參名

星號後面的形參名可以是任意名字,但是約定俗稱為args , 即 *args

# 示例:
def func(x,y,*z)
	print(x,y,z) # 1 2 (3,4,5)
    
func(1,2,3,4,5)   

*在實參中應用 ( 星號後面跟可迭代物件 ):

實參中帶* , 在星號後面的值會被打散成位置引數

def func(x,y,z):
    print(x,y,z)
    
func(*[1,2,3])  # func(1,2,3)
# 小練習
def func1(x,y,*args):
    print(x,y,args) # 1 2 (3,4,5)  
func1(1,2,*[3,4,5])


def func2(x,y,*args):
    print(x,y,args) # h e ("l","l",'o')
func2(*"hello")

3.2 可變長度的關鍵字引數

**形參名:用來接收溢位的關鍵字實參 , 溢位的關鍵字實參會被**儲存成字典的格式然後賦值緊跟其後打的

參名星星號後面的形參名可以是任意名字,但是約定俗稱為kwargs , 即 **kwargs

def func(x,y,**kwargs):
    print(x)   # 1
    print(y)   # 2
    print(kwargs)  # {'z':3,'a':4}
    
func(1,y=2,z=3,a=4)

**在實參中的應用( 星星號後面只能跟字典 )

實參中帶** , 在星號星號後面的值會被打散成關鍵字引數

def func(x,y,z):
    print(x,y,z)  # 1 2 3
    
func(**{"x":1,"y":2,'z':3})
# 小練習
def func(x,y,**kwargs):
    print(x,y,kwargs)  # 1 2 {"x":1,"y":2,'z':3}
    
func(1,2,**{"x":1,"y":2,'z':3})


def func(x,y,**kwargs):
    print(x,y,kwargs)  # 1 2 {'z':3,'a':4,'b':5}
    
func(**{"x":1,"y":2,'z':3,'a':4,'b':5})

3.3 混用*和**

*args必須在**kwargs之前

當*args必須在**kwargs混用的時候,該函式可以接受任意的實參,只要實參的順序是對的。

def func(*args,**kwargs):
    print(args)     # (1, 2, 3, 4, 5)
    print(kwargs)   # {'x': 1, 'y': 2, 'z': 3, 'c': 5}

func(1,2,3,4,5,x=1,y=2,z=3,c=5)

4. 引數補充

4.1 命名關鍵字引數(瞭解)

命名關鍵字引數:在定義函式時,*後面的引數,稱之為命名關鍵字引數

特點:命名關鍵字實參必須按照key=value的形式為其傳值

def func(x, y, *, a, b):  # 其中a和b稱之為命名關鍵字引數
    print(x, y)  # 1 2
    print(a, b)  # 111  222


func(1, 2, b=222, a=111)


def func1(x, y, *, a=1, b):  # 其中a和b稱之為命名關鍵字引數,只不過a被賦了一個預設值1
    print(x, y) # 1 2
    print(a, b) # 1 222


func1(1, 2, b=222)

4.2 組合使用

位置形參,預設形參, *args, 命名關鍵字形參,**kwargs

def func(x, y=11, *args, z, **kwargs):
    print(x)
    print(y)
    print(args)
    print(z)
    print(kwargs)

func(111,222,*[333,444],**{'a':666,'b':777},z=555)
# 遇到*和**,不要慌把*看成位置實參,**看成關鍵字實參

位置實參, 關鍵字實參