Python3进阶学习笔记(*args、*kwargs、生成器、内置函数map和filter)持续更新中......

一、*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')

 输出:
 argv是一个tupel元组类型
 first normal arg: yasoob
 another arg through *argv:python
 another arg through *argv:eggs
 another arg through *argv:test
def greet(**kwargs):
    for key,value in kwargs.items():
        print("{0} == {1}".format(key,value))

greet(name="python")
输出:
kwargs的类型是dict字典
name == python

二、生成器(Generators)

迭代器:

1、可迭代对象(Iterabel)

一个可迭代对象是python中任意的对象,只要定义了可以返回一个迭代器的__iter__方法
或者定义可以支持下标索引的__getitem方法,可迭代对象可以是任意对象,只要他能给我们提供一个迭代器。

2、迭代器(Iterator)

一个迭代器是任意一个对象,只要定义了next或者__next__方法,这就是迭代器。

3、迭代(Iteration)

简单讲,他就是从某个地方(列表)取出一个元素的过程。当时用一个循环来遍历某个东西时,这就叫一个迭代。

4、生成器

生成器也是一种迭代器,但是只能对其迭代一次。这是因为他们并没有把所有的值存在内存中,而是在运行时生成值。通过遍历来使用他们,要么用一个“for”循环,要么将他们传递给任意可以进行迭代的函数和结构。大多数生成器是以函数来实现的。然而,他们并不返回一个值,而是yield一个值。

例如:

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

python2里的标准库函数都会返回列表,python3都修改成返回生成器,因为生成器占用更少的资源。
下面是一个计算斐波那契数列的生成器(占用资源少):

def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a+b
for x in fibon(100):
    print(x)

然而,如果这样实现:

def fibon(n):
    a = b = 1 
    result = []
    for i in range(n):
        result.append(a)
        a, b = b, a+b
     return result

这也许会在计算很大的输入参数时用尽所有的资源。

生成器使用一次迭代,在测试之前需要知道python内置函数,next(),它允许我们回去一个序列的下一个元素,如下:

def generator_finction():
    for i in range(3)
        yield i 
gen = generator_function()
print(next(gen))
output 0
print(next(gen))
output 1
print(next(gen))
output 2
print(next(gen))
 Output: Traceback (most recent call last):
#            File "<stdin>", line 1, in <module>
#         StopIteration

可以看到,yield掉所有值后,next()触发了一个StopIteration的异常,异常说明所有值已经yield完。但是for循环为什么没有这个异常呢?因为for循环会自动捕获这个异常并停止调用next().

你知不知道python中一些内置的数据类型也会支持迭代,如下:

my_string = "yasoob"
next(my_string)
Output: Traceback (most recent call last):
#      File "<stdin>", line 1, in <module>
#    TypeError: str object is not an iterator

这个异常说str不是一个迭代器,它是一个可迭代对象,但不是一个迭代器。这意味着他支持迭代,但是不能直接对其进行迭代操作。那如何迭代呢?内置函数,iter。它可以根据一个可迭代对象返回一个迭代器对象,如下:

my_string = "yasoob"
my_iter = iter(my_string)
next(my_iter)
output 'y'

三、内置函数

1、Map

Map会将一个函数映射一个输入列表的所以元素,如下规范:

	map(function_to_apply, list_of_inputs)

当要把列表中所有与三俗一个个的传递给一个函数,并收集输出。如下:

items = [1,2,3,4]
lists =[]
for i in items:
    lists.append(i)

使用map函数:
items = [1,2,3,4]
lists =list(map(lambda x:x**2, items))

大多数时候、我们使用匿名函数(lambdas)来配合map,不仅用于一列表的输入,甚至可以用于以列表的函数:

def multiply(x):
    return (x*x)
def add(x):
    return (x+x)
funcs = [multiply, add]
for i in range(5):    
    value = list(map(lambda x: x(i), funcs))    
    print(value)
# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]
# Python进阶24Map

2、 Filter

filter能创建一个列表,其中每个元素都是对一个函数能返回True,例如:

number_list = range(-5, 5)
less_than_zero = list(filter(lambda x: x < 0, number_list))
print(less_than_zero)
# Output: [-5, -4, -3, -2, -1]

filter类似于一个for循环,但是他是一个内置函数,并且快。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老糊涂Lion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值