Python 知识点杂记

目录(环境Python3.6)

各种函数杂记

map函数

zip函数

dict.fromkeys()

切片操作

yield 生成器


 


各种函数杂记

map函数

map(func, *iterables)
map()接收一个函数func和一个可迭代对象,并通过把函数func依次作用在每个迭代对象上,得到一个新的list 并返回。

def f(x):
    return x*x
print(list(map(f, [1, 2])))
输出结果:
[1, 4]
##使用元组赋值 对列表进行拆分
##有字典-键值对的效果诶
bob=[['name','Bob'],['age',42]]
for (name,value) in bob:
    print(name)
    print(value)
=================================
name
Bob
age
42

zip函数

函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

name=['name','age'];
value=['bob',42];
m=zip(name,value);
for item in m:
    print(item);
=====================
('name', 'bob')
('age', 42)

name=['name','age']
value=['bob',42]
mmm=zip(name,value)
print(list(zip(*mmm)))   #解压
======================
[('name', 'age'), ('bob', 42)]

dict.fromkeys()

dict.fromkeys(seq[, value])
seq -- 字典键值列表。
value -- 可选参数, 设置键序列(seq)的值。默认为None
=====================================================

seq = ('Google', 'Runoob', 'Taobao')
 
dict = dict.fromkeys(seq)
print "%s" %  str(dict)
 
dict = dict.fromkeys(seq, 10)
print "%s" %  str(dict)
=====================================================
{'Google': None, 'Taobao': None, 'Runoob': None}
{'Google': 10, 'Taobao': 10, 'Runoob': 10}

print

print 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字。

print(*objects, sep=' ', end='\n', file=sys.stdout)
-->sep -- 用来间隔多个对象,默认值是一个空格。
-->end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
-->file -- 要写入的文件对象。
===================================================================
print("www","runoob","com",sep=".")  # 设置间隔符
www.runoob.com

切片操作

a=[1,2,3,4]
print(a)
print(a[-1]) ###取最后一个元素
print(a[:-1])  ### 除了最后一个元素取全部
print(a[1:3])  ###取下标为1,2的两个元素
print(a[::-1]) ### 取从后向前(相反)的元素 
print(a[2::-1]) ### 取从下标为2的元素向前翻转读取
==============================================
[1, 2, 3, 4]
4
[1, 2, 3]
[2, 3]
[4, 3, 2, 1]
[3, 2, 1]

yield 生成器

输出斐波那契數列的前 N 个数

方法一:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print b 
        a, b = b, a + b 
        n = n + 1
fab(5)

直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。

方法二:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def fab(n): 
    a, b = 0, 1 
    c = [] 
    for i in range(n):
        c.append(b) 
        a, b = b, a + b 
    return c

if __name__ == '__main__':
    for i in fab(5): 
        print(i)

改写后的 fab 函数通过返回 List 能满足复用性的要求,但该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List来保存中间结果,而是通过 iterable 对象来迭代。

方法三:

class Fab(object): 
 
    def __init__(self, max): 
        self.max = max 
        self.n, self.a, self.b = 0, 0, 1 
 
    def __iter__(self): 
        return self 
 
    def __next__(self): ## 写def next(self)会报错,因为python3迭代器规则发生变化,要用__next__
        if self.n < self.max: 
            r = self.b 
            self.a, self.b = self.b, self.a + self.b 
            self.n = self.n + 1 
            return r 
        raise StopIteration()
### 对于可迭代对象f
### f.__next__()调用到最后会弹出StopIteration()异常,表示迭代完成
### for _ in f 则不会,调用到最后,循环自动结束

if __name__ == '__main__':
    for i in Fab(5): 
        print(i)
========================================================
1
1
2
3
5

但用 class 改写过于复杂,若想要保持方法一的简洁性,同时又要获得 iterable 的效果,可用yield,将函数变成一个生成器,返回一个iterable可迭代对象f,可用for _ in f 或者手动 f.__next__() 进行调用。

方法四:

def fab(max): 
    a, b = 0, 1 
    for i in range(max): 
        yield b
        a, b = b, a + b 

if __name__ == '__main__':
    for i in fab(5): 
        print(i)

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

 

 

参考:

https://www.runoob.com/w3cnote/python-yield-used-analysis.html

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值