python学习笔记

大佬曰:把知识用自己的语言讲出来,你才算是学会了这个知识。我就用这种方式写一下自己的python学习笔记吧,编写博客边复习自己模糊的知识点。

foo和bar

foo和bar就是外国人口中的张三李四……

形参和实参

形参:具体的值
实参:定义函数时在括号里申明的变量
看到后觉得有个印象,但就是想不起来是什么(18年以前肯定是知道的)

global关键字

声明在函数内:使用全局变量
声明在函数外:非内联的变量

1
2
3
4
jinkela = 1800
def f():
global jinkela
jinkela *= 2

回调函数

很好理解,就是 把 作为参数传递 并被调用 的函数 叫做回调函数

1
2
3
def 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
20
def 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
    2
    f1 = lambda x:x**233
    f2 = lambda x:666 if x=='6' else 114514
    用于避免简单功能用多行代码实现

迭代器

迭代器的使用

C++里的迭代器是用来访问元素内部变量……之类的事情
python也是如此
那么python的迭代器怎么用呢?

1
2
3
4
5
it = 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__应返回self

1
2
3
4
5
6
7
8
9
10
class 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 该例子来自https://www.runoob.com/python3/python3-iterator-generator.html
import sys

def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()

输出结果:

0 1 1 2 3 5 8 13 21 34 55

读者可以尝试稍作修改,理解一下没有yield时的输出结果。

内置函数

就是python解释器自带的函数

with关键字

with可用于简化try-finally

原始代码:

1
2
3
file = open('./test.md', 'w')
file.write('hello!')
file.close()

使用try-finally

1
2
3
4
5
file = open('./test.md', 'w')
try:
file.write('hello!')
finally:
file.close()

使用with简化(with搭配as使用)

1
2
with open('./test.md', 'w') as file:
file.write('hello!')

来自Python with 关键字

with 语句实现原理建立在上下文管理器之上。
上下文管理器是一个实现 enterexit 方法的类。
使用 with 语句确保在嵌套块的末尾调用 exit 方法。
在文件对象中定义了 enterexit 方法,即文件对象也实现了上下文管理器,首先调用 enter 方法,然后执行 with 语句中的代码,最后调用 exit 方法。 即使出现错误,也会调用 exit 方法,也就是会关闭文件流。
这个概念类似于 try…finally 块的使用。

同样的,在pyserial中,Serial也实现了上下文管理器,所以我们可以省略手动关闭串口的步骤:

1
2
3
4
5
import serial
with serial.Serial('COM6', 19200, timeout=1) as ser:
onebyte = ser.read()
tenbytes = ser.read(10)
linebytes = ser.readline()

延时

1
2
import time
time.sleep(t)

t: 秒数(不是毫秒数)

串口输入输出

使用pyserial。官方文档:pySerial document

Introduction

1
pip install pyserial

安装好之后可以通过

1
import serial as ser

来使用。

确定串口号

1
2
3
4
5
6
7
8
9
10
import serial as ser
import serial.tools.list_ports

ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) == 0:
print('无可用串口')
else:
print('可用的串口:')
for comport in ports_list:
print(list(comport)[0], list(comport)[1])

效果:

1
2
3
4
可用的串口:
COM4 蓝牙链接上的标准串行 (COM4)
COM6 蓝牙链接上的标准串行 (COM6)
COM3 蓝牙链接上的标准串行 (COM3)

我们可以通过list(ports_list[index])[0]获取想要的串口的名称。

read & write

1
2
3
4
5
6
7
8
9
import serial as ser

dat = [0x00, 0x01, 0x02, 0x03]

com = ser.Serial('COM11')
com.write('Hello World!')
com.write(dat)
print(com.read())
print(com.read(13))

限制参数类型

1
2
def func(name: str, num: int) -> str
return name + str(num)
作者

勇敢梧桐树

发布于

2021-08-16

更新于

2023-09-03

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×