目录(环境Python3.6)
各种函数杂记
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 在 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