阅读目录
一、 *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’]
此博客记录平时的积累