注:学习笔记来源于自己在学习Python过程中遇到的小问题及对网络诸多大牛提供的方法的实践。
一、yield语句
例:
>>> def flatten(nested):
>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
Traceback (most recent call last):
TypeError: 'int' object is not iterable
程序报错,说 flatten(nested) 是不可迭代的,所以来看一下 flatten(nested) 到底输出了什么。
>>> nested = [[1, 2],[3, 4], [5]]
>>> flatten(nested)
1
>>> flatten(nested)
1
发现原来 flatten(nested) 只输出了一个 int 类型的数,即当函数 flatten 在对列表 nested 进行循环的时候,第一遍采集到数字 1 时,就 return 了,函数就结束了。
看一下yield
>>> def flatten(nested):
>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
1
2
3
4
5
>>> list(flatten(nested))
[1, 2, 3, 4, 5]
可以看到,此时 flatten(nested) 返回的是一个列表,可迭代输出。即当函数 flatten 对 nested 进行循环的时候,采集到第一个值 1 的时候,函数即冻结,激活后仍会继续执行双循环,而不是结束函数。
二、八皇后问题
要求:在 8 * 8 的棋盘上,8 个皇后不在同行、同列、同对角线。
(1)定义冲突
>>> def conflict(state, nextX):
其中,nextX 指下一个皇后将要放置的横坐标,也就是列。nextY 指下一个皇后将要放置的纵坐标,即行。state是一个列表,列表内存放着已经放置好的皇后的位置,即存放着元组 (x ,
注:
(2)放置皇后
>>> def queens(num = 8, state = ()):
注:程序分为
其中,
如果放置 4 个皇后,则有 2 种放置方法:
>>> list(queens(4))
[(1, 3, 0, 2), (2, 0, 3, 1)]
应用 print 可以把不同的放置方法,一行一行打印出来。
(3)打包输出
输出简易的放置了皇后的棋盘。
>>> def prettyprint(solution):
>>> import random
>>> prettyprint(random.choice(list(queens(8))))
.
.
.
.
.
X
.
.