Python进阶笔记(1)

 

'''
首先感谢原作者 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))

 

转载于:https://my.oschina.net/zhackj/blog/1787005

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值