'''
首先感谢原作者 Muhammad Yasoob Ullah Khalid.
感谢翻译大牙
非常不错的进阶教程
*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。
这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景
下使用这两个关键字。 *args 是用来发送一个非键值对的可变数量的参数列表给一个函
数。**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函
数里处理带名字的参数, 你应该使用**kwargs。
'''
def test_var_args(f_arg,*argv): #不知道参数的个数
print("first arg:",f_arg)
for arg in argv:
print("another arg:",arg)
test_var_args("111","222","333","4444")
print('----------------------------------')
def greet_me(**kwargs): #带名字的参数
for key,value in kwargs.items():
print("%s=%s"% (key,value))
greet_me(name="222222222")
print('----------------------------------')
def test_args_kwargs(arg1,arg2,arg3):
print("arg1:",arg1)
print("arg2:",arg2)
print("arg3:",arg3)
args = ("two",3,5)
test_args_kwargs(*args)
print('----------------------------------')
kwargs = {"arg3":3,"arg2":"two","arg1":5}
test_args_kwargs(**kwargs)
'''
可迭代对象(Iterable)
一个可迭代对象是Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__
用法,或者定义了可以支持下标索引的__getitem__用法(这些双下划线方法会在其他章
节中全面解释)。简单说,一个可迭代对象,就是任意的对象,只要它能给我们提供一个
迭代器。那迭代器又是什么呢?
迭代器(Iterator)
一个迭代器是任意一个对象,只要它定义了一个next(Python2) 或者__next__用法。就
这么简单。这就是一个迭代器。现在我们来理解迭代(iteration)
迭代(Iteration)
用简单的话讲,它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使一
个循环来遍历某个东西时,这就叫一个迭代。它是这个过程本身的名字。现在既然我们有
了这些术语的基本理解,那我们开始理解生成器吧。
生成器(Generators)
生成器也是一种迭代器,但是你只能对其迭代一次。这是因为他们并没有把所有的值存在
内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它
们传递给任意可以进行迭代的函数和结构。大多数时候生成器是以函数来实现的。然而,
它们并不返回一个值,而是yield(暂且译作“生出”)一个值。
生成器最佳应用场景是:你不想同一时间将所有计算出来的大
量结果集分配到内存当中,特别是结果集里还包含循环。
'''
def 生成器():
for i in range(10):
yield i
for item in 生成器():
print(item)
def fibon(n):
a = b = 1
for i in range(n):
yield i,a,b #类似于return
a,b = b,a+b
# yield i,a,b #这里是做测试用的,可以试下放上面和放下面的区别
for x in fibon(10):
print(x)
'''
Map
Map会将一个函数映射到一个输入列表的所有元素上。大多数时候,我们使用匿名函数(lambdas)来配合map。
看了作者介绍,推导式更受欢迎,顾加上了推导式的用法
'''
items = [1,2,3,4,5]
squared = list(map(lambda x:x**2,items))
print(squared)
# print('-------------------')
list = [i*i for i in items] #推导式的用法,结果与上面的一致
print(list)
print('-------------------')
def multiply(x): #定义好返回函数,利用map批量处理
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)
print('-------------------')
list = [[x*x,x+x] for x in range(5)] #同样结果是一样的哦
print(list)
#扩展推导式
list1 = [(x,y) for x in range(5) for y in range(5)] #排列出来了,有内置函数可以直接算排列和组合的
print(list1)
'''
set(集合)数据结构
set(集合)是一个非常有用的数据结构。它与列表(list)的⾏为类似,区别在于set不能
包含重复的值。
这里介绍一个经验,最近在爬斗鱼的弹幕,JS返回弹幕的那种,而且加密了。暂时没办法弄,只能靠前端,但是前端包含了所有的li标签,,而且经常在刷新,很容易出垃圾数据,简单的set功能就可以帮助我们去除已经爬过的数据
'''
some_list = ['a','b','c','d','c','a']
duplicates = set([x for x in some_list if some_list.count(x) > 1])#挑出重复的字母
print(duplicates)
some_list1 = set(['a','b','c','d','c','a'])
input_set = set(['b','f'])
print(input_set.intersection(some_list1)) #找相同的字母
print(input_set.difference(some_list1)) #找不同的字母
用符号来创建集合,还记得字典么?
a_set = {'a','b','c','d','c','a'}
print(type(a_set))