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进阶中文版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值