python學習筆記(進階)

一、 *args與**kwargs的用法

args 和 **kwargs 主要⽤於函數定義。 你可以將不定數量的參數傳遞給⼀個函數。
這⾥的不定的意思是:預先並不知道, 函數使⽤者會傳遞多少個參數給你, 所以在這個場景下使⽤這兩個關鍵字。

*args 是⽤來發送⼀個⾮鍵值對的可變數量的參數列表給⼀個函數.

def test_var_args(f_arg,*argv):
    print("First normal arg:",f_arg)
    for arg in argv:
        print("another arg through *argv:",arg)
test_var_args('yasoob','python','eggs','test')

運行結果:
在這裏插入圖片描述
** kwargs 允許你將不定長度的鍵值對, 作爲參數傳遞給⼀個函數。 如果你想要在⼀個函
數⾥處理帶名字的參數, 你應該使⽤**kwargs。

def greet_me(**kwargs):
    for key,value in kwargs.items():
        print("{0} == {1}".format(key,value))

運行結果:
在這裏插入圖片描述

二、使⽤ *args 和 **kwargs 來調⽤函數

def test_args_kwargs(arg1,arg2,arg3):
    print("arg1:",arg1)
    print("arg2:",arg2)
    print("arg3:",arg3)

⾸先使⽤ *args來調⽤函數
在這裏插入圖片描述
現在使⽤ **kwargs來調⽤函數
在這裏插入圖片描述

標準參數與*args、**kwargs在使⽤時的順序

那麼如果你想在函數⾥同時使⽤所有這三種參數, 順序是這樣的:
some_func(fargs, *args, **kwargs)

三、⽣成器(Generators)

⽣成器也是⼀種迭代器,但是你只能對其迭代⼀次。這是因爲它們並沒有把所有的值存在內存中,⽽是在運⾏時⽣成值。你通過遍歷來使⽤它們,要麼⽤⼀個“for”循環,要麼將它們傳遞給任意可以進⾏迭代的函數和結構。⼤多數時候⽣成器是以函數來實現的。然⽽,它們並不返回⼀個值,⽽是yield(暫且譯作“⽣出”)⼀個值。這⾥有個⽣成器函數的簡單的例子:

def generator_function():
    for i in range(5):
        yield i
for item in generator_function():
    print(item)

運行結果:
在這裏插入圖片描述
許多Python 2⾥的標準庫函數都會返回列表,⽽Python 3都修改成了返回⽣成器,因爲⽣成
器佔⽤更少的資源。

四、Map,Filter 和 Reduce

1、Map

Map會將⼀個函數映射到⼀個輸⼊列表的所有元素上。這是它的規範:
規範:map(function_to_apply, list_of_inputs)
⼤多數時候,我們要把列表中所有元素⼀個個地傳遞給⼀個函數,並收集輸出。

items = [1, 2, 3, 4, 5]
squared = []
for i in items:
    squared.append(i**2)
print(squared)

Map可以⽤⼀種簡單⽽漂亮得多的⽅式來實現。就是這樣:

items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
print(squared)

運行結果:
在這裏插入圖片描述

2、Filter

filter過濾列表中的元素,並且返回⼀個由所有符合要求的元素所構成的列表,符合要求即函數映射到該元素時返回值爲True. 這⾥是⼀個簡短的例⼦:

number_list = range(-5,5)
less_than_zero = filter(lambda x:x<0,number_list)
print(list(less_than_zero))

運行結果:[-5, -4, -3, -2, -1]

這個filter類似於⼀個for循環,但它是⼀個內置函數,並且更快。

3、reduce

當需要對⼀個列表進⾏⼀些計算並返回結果時,Reduce 是個⾮常有⽤的函數。舉個例
⼦,當你需要計算⼀個整數列表的乘積時。
通常在 python 中你可能會使⽤基本的 for 循環來完成這個任務。
現在我們來試試 reduce:

from functools import reduce
product = reduce( (lambda x,y:x *y),[1,2,3,4])
print(product)

運行結果:24

五、set(集合)數據結構

set(集合)是⼀個⾮常有⽤的數據結構。它與列表(list)的⾏爲類似,區別在於set不能包含重複的值。
這在很多情況下⾮常有⽤。例如你可能想檢查列表中是否包含重複的元素,你有兩個選擇,第⼀個需要使⽤for循環,就像這樣:

some_list = ['a','b','c','d','e','b','m','n','n']
duplicates = []
for value in some_list:
    if some_list.count(value) > 1:
        if value not in duplicates:
            duplicates.append(value)
print(duplicates)

但還有⼀種更簡單更優雅的解決⽅案,那就是使⽤集合(sets),你直接這樣做:

some_list = ['a','b','c','d','e','b','m','n','n']
duplicates = set([x for x in some_list if some_list.count(x)>1])
print(duplicates)

運行結果:{‘n’, ‘b’}

集合還有⼀些其它⽅法

1、交集

你可以對⽐兩個集合的交集(兩個集合中都有的數據),如下:

valid = set(['yellow', 'red', 'blue', 'green', 'black'])
input_set = set(['red', 'brown'])
print(input_set.intersection(valid))

運行結果: [‘red’]

2、差集

你可以⽤差集(difference)找出⽆效的數據,相當於⽤⼀個集合減去另⼀個集合的數據,例如:

valid = set(['yellow', 'red', 'blue', 'green', 'black'])
input_set = set(['red', 'brown'])
print(input_set.difference(valid))

運行結果: [‘brown’]

此博客記錄平時的積累

來自python進階中文版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章