系列索引菜菜的Python学习日记 | Python从入门到入土详解
今天开始学习Python语言进阶部分。
文章目录
- 函数的使用方式
- 装饰器
- 迭代器和生成器
函数的使用方式
- 高阶函数的用法(
filter
、map
以及它们的替代品)
python">items1 = list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10))))
items2 = [x ** 2 for x in range(1, 10) if x % 2]
-
global
和nonlocal
关键字的作用global
:声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)。
nonlocal
:声明使用嵌套作用域的变量(嵌套作用域必须存在该变量,否则报错)。
python">def nonlocal_test():
count = 0
def test2():
nonlocal count
count += 1
return count
return test2
val = nonlocal_test()
print(val())
print(val())
print(val())
以上输出为:1,2,3
装饰器
参考知乎大佬的文章,讲的很全很详细。
迭代器和生成器
迭代器是实现了迭代器协议的对象。
- Python中没有像
protocol
或interface
这样的定义协议的关键字。 - Python中用魔术方法表示协议。
__iter__
和__next__
魔术方法就是迭代器协议。
python">class Fib(object):
"""迭代器"""
def __init__(self, num):
self.num = num
self.a, self.b = 0, 1
self.idx = 0
def __iter__(self):
return self
def __next__(self):
if self.idx < self.num:
self.a, self.b = self.b, self.a + self.b
self.idx += 1
return self.a
raise StopIteration()
- 生成器是语法简化版的迭代器。
python">def fib(num):
"""生成器"""
a, b = 0, 1
for _ in range(num):
a, b = b, a + b
yield a
- 生成器进化为协程。
生成器对象可以使用send()
方法发送数据,发送的数据会成为生成器函数中通过yield
表达式获得的值。这样,生成器就可以作为协程使用,协程简单的说就是可以相互协作的子程序。
python">def calc_avg():
"""流式计算平均值"""
total, counter = 0, 0
avg_value = None
while True:
value = yield avg_value
total, counter = total + value, counter + 1
avg_value = total / counter
gen = calc_avg()
next(gen)
print(gen.send(10))
print(gen.send(20))
print(gen.send(30))
Python从入门到入土系列持续更新,欢迎
点赞收藏
+关注
上一篇:菜菜的Python学习日记 | Python进阶笔记(生成式、常用算法、函数定义和调用时都加*,有什么作用?)
下一篇:菜菜的Python学习日记 | 一文读懂Python多线程、多进程、异步I/O处理的区别
本人水平有限,文章中不足之处欢迎下方👇评论区批评指正~如果感觉对你有帮助,点个赞👍 支持一下吧 ~
不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 🤝 我的博客 ,期待在这与你相遇 ~