python学习笔记
大佬曰:把知识用自己的语言讲出来,你才算是学会了这个知识。我就用这种方式写一下自己的python学习笔记吧,编写博客边复习自己模糊的知识点。
foo和bar
foo和bar就是外国人口中的张三李四……
形参和实参
形参:具体的值
实参:定义函数时在括号里申明的变量
看到后觉得有个印象,但就是想不起来是什么(18年以前肯定是知道的)
global关键字
声明在函数内:使用全局变量
声明在函数外:非内联的变量1
2
3
4jinkela = 1800
def f():
global jinkela
jinkela *= 2
回调函数
很好理解,就是 把 作为参数传递 并被调用 的函数 叫做回调函数1
2
3def a(f):
f("Hello World")
a(print)
输出结果为Hello World
闭包函数
被某个函数返回的内函数叫闭包函数,且这个函数使用了外函数的局部变量1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20def mei():
jinkela = '一代能顶两袋撒'
def ri():
nonlocal jinkela
jinkela += '亩产一千八'
print(jinkela)
return ri
# 如果要使用mei的返回结果:
res = mei() # 坏了,res成了函数(的引用)了
res() # 在申了在申了思密达
res()
res()
res()
# 但是如果你这样用好多次
mei()()
# 结果是不同的,读者可自行尝试
#############################
# 检测某函数是否为内函数
print(res.__closure__) # cell
print(mei.__closure__) # None
lambda expression:匿名函数
- 不是代码块,是一行代码
- 只能使用形参,全局变量也不能用用于避免简单功能用多行代码实现
1
2f1 = lambda x:x**233
f2 = lambda x:666 if x=='6' else 114514
迭代器
迭代器的使用
C++里的迭代器是用来访问元素内部变量……之类的事情
python也是如此
那么python的迭代器怎么用呢?1
2
3
4
5it = iter([1,2,3,4])
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
print(next(it)) # 4
创建一个迭代器
如何在自己写的class里使用呢?
用__iter__()
、__next__()
,其中__iter__
应返回self1
2
3
4
5
6
7
8
9
10class myClass:
val = [1,2,3,4,5]
__iter__(self):
self.counter = 0
return self
__next__(self):
self.counter += 1
if self.counter >= 5
raise StopIteration # 停止继续迭代
return val[self.counter]
生成器
当然你也可以使用生成器,让函数“变成”一个迭代器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
1 | # 该例子来自https://www.runoob.com/python3/python3-iterator-generator.html |
输出结果:
0 1 1 2 3 5 8 13 21 34 55
读者可以尝试稍作修改,理解一下没有yield时的输出结果。
内置函数
就是python解释器自带的函数
with关键字
with
可用于简化try-finally
。
原始代码:
1 | file = open('./test.md', 'w') |
使用try-finally
1 | file = open('./test.md', 'w') |
使用with
简化(with
搭配as
使用)
1 | with open('./test.md', 'w') as file: |
with 语句实现原理建立在上下文管理器之上。
上下文管理器是一个实现 enter 和 exit 方法的类。
使用 with 语句确保在嵌套块的末尾调用 exit 方法。
在文件对象中定义了 enter 和 exit 方法,即文件对象也实现了上下文管理器,首先调用 enter 方法,然后执行 with 语句中的代码,最后调用 exit 方法。 即使出现错误,也会调用 exit 方法,也就是会关闭文件流。
这个概念类似于 try…finally 块的使用。
同样的,在pyserial
中,Serial
也实现了上下文管理器,所以我们可以省略手动关闭串口的步骤:
1 | import serial |
延时
1 | import time |
t: 秒数(不是毫秒数)
串口输入输出
使用pyserial
。官方文档:pySerial document
Introduction
1 | pip install pyserial |
安装好之后可以通过
1 | import serial as ser |
来使用。
确定串口号
1 | import serial as ser |
效果:
1 | 可用的串口: |
我们可以通过list(ports_list[index])[0]
获取想要的串口的名称。
read & write
1 | import serial as ser |
限制参数类型
1 | def func(name: str, num: int) -> str |