閱讀目錄
一、 *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’]
此博客記錄平時的積累