一、yield语句

任何包含 yield 语句的函数称为生成器, yield 不像 return 那样返回值,yield 每次产生多个值。使用 yield 语句每次产生一个值后,函数就会被冻结:即函数停在这一点等待被激活,激活后从此点开始执行。

例:

>>> def flatten(nested):
               for sublist in nested:
                        for element in sublist:
                                        return element
>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
                      print (num)

Traceback (most recent call last):
  File "", line 1, in
    for num in flatten(nested):
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):
                  for sublist in nested:
                            for element in sublist:
                                       yield element

>>> nested = [[1, 2],[3, 4], [5]]
>>> for num in flatten(nested):
                    print (num)

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):
                       nextY = len(state)
                       for i in range(nextY):
                                 if abs(state[i] - nextX) in (0, nextY - i):

return True
                       return False

其中,nextX 指下一个皇后将要放置的横坐标,也就是列。nextY 指下一个皇后将要放置的纵坐标,即行。state是一个列表,列表内存放着已经放置好的皇后的位置,即存放着元组 (x , y) ,state[ i ] = j 指第(i + 1)行的皇后在第(j + 1)列。

注: if abs(state[i] - nextX) in (0, nextY - i):  中的 (0, nextY - i):  指前面的数是否为 0 或者 nextY - i 两者中的一个,并不是指处在某个范围里面。

(2)放置皇后

>>> def queens(num = 8, state = ()):
                        for pos in range(num):
                                      if not conflict(state, pos):
                                                   if len(state) == num - 1:
                                                                yield (pos,)
                                                   else:
                                                              for result in queens(num, state + (pos,)):
                                                                          yield (pos,) + result

注:程序分为   if len(state) == num - 1:  和  else:  两部分,是因为,递归都需要有一个递归结束的点,否则,递归就会无止境的不断进行下去。

其中, for pos in range(num):  这一行,指的是给将要放置的新皇后,她的纵坐标已固定(由定义冲突里的 nextY = len(state) 来固定的),所以,需要在8个列位置上,给她进行选择放置的位置。

如果放置 4 个皇后,则有 2 种放置方法:

>>> list(queens(4))
[(1, 3, 0, 2), (2, 0, 3, 1)]

应用 print 可以把不同的放置方法,一行一行打印出来。

(3)打包输出

输出简易的放置了皇后的棋盘。

>>> def prettyprint(solution):
               def line(pos, length = len(solution)):
                           return '.   ' * (pos) + 'X   ' + '.   ' * (length - pos - 1)
               for pos in solution:                          #依次取出随机挑选的方案里的每个数,即每位皇后在自己的行中坐所在的列。
                           print (line(pos))

>>> import random
>>> prettyprint(random.choice(list(queens(8))))        #在queens(8) 的方案里随机挑选一个
.   .   X   .   .   .   .   .
.   .   .   .   .   X   .   .
.   .   .   .   .   .   .   X
.   X   .   .   .   .   .   .
.   .   .   X   .   .   .   .
X   .   .   .   .   .   .   .
.   .   .   .   .   .   X   .
.   .   .   .   X   .   .   .

欢迎关注微信公众号,与您分享更多精彩内容!

Python学习笔记之八皇后问题相关推荐

  1. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  2. python学习笔记之编写readConfig读写配置文件

    python学习笔记之编写readConfig读写配置文件_weixin_34055910的博客-CSDN博客

  3. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  4. Python学习笔记一简介及安装配置

    Python学习笔记一 参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e54 ...

  5. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  6. Python学习笔记(二):标准流与重定向

    Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...

  7. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  8. python基本语法语句-python学习笔记:基本语法

    原标题:python学习笔记:基本语法 缩进:必须使用4个空格来表示每级缩进,支持Tab字符 if语句,经常与else, elif(相当于else if) 配合使用. for语句,迭代器,依次处理迭代 ...

  9. 廖Python学习笔记一

    1. 廖Python学习笔记 大的分类 如函数 用二级标题,下面的用三级 如输入输出 1.1.1. 输入输出 1.1.1.1. 输出 用 print() 在括号里加上字符串,就可以向屏幕上输出指定的文 ...

  10. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

最新文章

  1. FckEditor-未能映射路径/UserFiles/image/
  2. oracle union详解,Oracle中的union和join
  3. java设置并行度_控制Java并行流的并行度
  4. 12-order by和group by 原理和优化 sort by 倒叙
  5. linux4.9下alsa架构,[Alsa]4, wm8524 Kernel音频子系统入口
  6. php举例--array,php中session的应用举例-php中array_key_exists与isset的区别...-php取整数的几种方式(实例)_169IT.COM...
  7. jQuery 学习笔记之十 (jQuery ajax )
  8. 二维码生成以及扫一扫解析二维码原理
  9. 判断运行环境是手机还是 PC
  10. 如何修复图片清晰度呢?这三款软件不要错过
  11. 深入mysql语言_深入简出mysql--第一部分
  12. 以太网帧机构 ,mtu ,分包原理 tcp的三次握手,四次挥手
  13. C++递归算法之分成互质组
  14. java-pdf合并三种方法实现以及简单效率对比
  15. 使用新路由器有线/无线桥接旧路由器
  16. slam初学(一)——Kdevelop的安装及汉化
  17. 机器人总动员主角简笔画_机器人总动员简笔画
  18. Create a Bootable 8G MicroSD Card for e-puck with wifi+webcam‏
  19. Java:一个API文档框架Swagger
  20. C/C++的就业,发展方向-个人而言

热门文章

  1. UltraVNC:一款高层玩家使用的远程控制软件
  2. Vue / axios / props 调用后端接口数据并渲染到页面
  3. 如何从零开始解读什么叫产品经理
  4. Apache POI 操作Excel表格使用详解 最全
  5. 根据计算机配置设置bios,电脑如何进入bios设置
  6. ACTS:首屈一指的软件测试策略是什么?
  7. Caused by: org.activiti.engine.ActivitiException: resource ‘org/activiti/db/create/activiti.dm.creat
  8. Halcon学习-算子学习-映射/傅里叶变换/gen_grid_region/rft_generic例程
  9. 【数据说第四期】篮球比赛中的投篮选择
  10. 大家的人工智能——学习路线总览