1.斐波那契数列
>>> def fibonacci(n):
a, b = 1, 1
for _ in range(n):
yield a
a, b = b, a+b # 注意这种赋值
>>> for fib in fibonacci(10):
print(fib)
1
1
2
3
5
8
13
21
34
55
2.list等分n组
>>> from math import ceil
>>> def divide_iter(lst, n):
if n <= 0:
yield lst
return
i, div = 0, ceil(len(lst) / n)
while i < n:
yield lst[i * div: (i + 1) * div]
i += 1
>>> for group in divide_iter([1,2,3,4,5],2):
print(group)
[1, 2, 3]
[4, 5]
**3.yield **
第一次yield返回1:
第二次迭代,直接到2的这句代码:
然后再走 for ,再 yield ,重复下去,直到for结束。
4.装饰器
from functools import wraps
import time
定义一个装饰器:print_info,装饰器函数入参要求为函数,返回值要求也为函数。
如下,入参为函数 f, 返回参数 info 也为函数,满足要求。
def print_info(f):
"""
@para: f, 入参函数名称
"""
@wraps(f) # 确保函数f名称等属性不发生改变
def info():
print('正在调用函数名称为: %s ' % (f.__name__,))
t1 = time.time()
f()
t2 = time.time()
delta = (t2 - t1)
print('%s 函数执行时长为:%f s' % (f.__name__,delta))
return info
@print_info
def f1():
time.sleep(1.0)
@print_info
def f2():
time.sleep(2.0)
f1()
f2()
# 输出信息如下:
# 正在调用函数名称为:f1
# f1 函数执行时长为:1.000000 s
# 正在调用函数名称为:f2
# f2 函数执行时长为:2.000000 s
5.迭代器案例
一个类成为迭代器类型,必须实现两个方法:_ iter_,next
下面编写一个迭代器类:
class YourRange():
def __init__(self, start, end):
self.value = start
self.end = end
# 成为迭代器类型的关键协议
def __iter__(self):
return self
# 当前迭代器状态(位置)的下一个位置
def __next__(self):
if self.value >= self.end:
raise StopIteration
cur = self.value
self.value += 1
return cur
使用这个迭代器:
yr = YourRange(5, 12)
for e in yr:
print(e)
迭代器实现__iter__ 协议,它就能在 for 上迭代
问题:如果此时运行:next(yr)
会输出5还是报错?
如果 yr 是 list,for 遍历后,再 next(iter(yr)) 又会输出什么?
1.matplotlib
导入包:
import matplotlib
matplotlib.__version__ # '2.2.2'
import matplotlib.pyplot as plt
``
绘图代码:
```python
import matplotlib.pyplot as plt
plt.plot([0, 1, 2, 3, 4, 5],
[1.5, 1, -1.3, 0.7, 0.8, 0.9]
,c='red')
plt.bar([0, 1, 2, 3, 4, 5],
[2, 0.5, 0.7, -1.2, 0.3, 0.4]
)
plt.show()
import seaborn as sns
sns.__version__ # '0.8.0'
绘图:
sns.barplot([0, 1, 2, 3, 4, 5],
[1.5, 1, -1.3, 0.7, 0.8, 0.9]
)
sns.pointplot([0, 1, 2, 3, 4, 5],
[2, 0.5, 0.7, -1.2, 0.3, 0.4]
)
plt.show()
import plotly
plotly.__version__ # '2.0.11'
绘图(自动打开html):
import plotly.graph_objs as go
import plotly.offline as offline
pyplt = offline.plot
sca = go.Scatter(x=[0, 1, 2, 3, 4, 5],
y=[1.5, 1, -1.3, 0.7, 0.8, 0.9]
)
bar = go.Bar(x=[0, 1, 2, 3, 4, 5],
y=[2, 0.5, 0.7, -1.2, 0.3, 0.4]
)
fig = go.Figure(data = [sca,bar])
pyplt(fig)
import pyecharts
pyecharts.__version__ # '1.7.1'
绘图(自动打开html)
bar = (
Bar()
.add_xaxis([0, 1, 2, 3, 4, 5])
.add_yaxis('ybar',[1.5, 1, -1.3, 0.7, 0.8, 0.9])
)
line = (Line()
.add_xaxis([0, 1, 2, 3, 4, 5])
.add_yaxis('yline',[2, 0.5, 0.7, -1.2, 0.3, 0.4])
)
bar.overlap(line)
bar.render_notebook()
matplotlib 绘制三维 3D 图形的方法,主要锁定在绘制 3D 曲面图和等高线图。