python算法

python 井字棋(Tic Tac Toe)

浪尽此生 提交于 2020-02-05 07:19:40
说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意。另外,90%+的代码也是本人逐字逐句敲的。 minimax算法还没完全理解,所以参考了 这里 的代码,并作了修改。 特点 可以选择人人、人机、机人、机机四种对战模式之一 电脑玩家的AI使用了minimax算法,带apha-beta剪枝 电脑玩家在思考时,时时刻刻都有一个 “假想敌” 。以便使得minimax算法运转起来 代码 作者:hhh5460 时间:2017年6月26日 # 棋盘 class Board(object): def __init__(self): #self._board = '-'*9 # 坑!! self._board = ['-' for _ in range(9)] self._history = [] # 棋谱 # 按指定动作,放入棋子 def _move(self, action, take): if self._board[action] == '-': self._board[action] = take self._history.append((action, take)) # 加入棋谱 # 撤销动作,拿走棋子 def _unmove(self, action): self._board[action] = '-' self._history.pop() # 棋盘快照

Python之路:常用算法与设计模式

好久不见. 提交于 2020-02-05 07:19:28
选择排序 时间复杂度 二、计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。 一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 2.一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))。随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))。 3.常见的时间复杂度 按数量级递增排列,常见的时间复杂度有: 常数阶O(1), 对数阶O(log2n), 线性阶O(n), 线性对数阶O(nlog2n), 平方阶O(n^2), 立方阶O(n^3),..., k次方阶O(n^k), 指数阶O(2

Python小课题练习作业

让人想犯罪 __ 提交于 2020-02-05 06:08:41
作业一 : 利用*字典*输出目录,可以选择目录进入,可以回退、退出! #conding:utf8menu = {'北京':{'昌平':{'沙河':{'昌平妇幼',}},'海淀':{'海淀一区':{'海淀二区'},}},} #字典嵌套current_layer = menu #利用此变量来记录当前的层的位置pre_menu = [] #用【】来记录每一层while True: for k in current_layer: print (k) choice = input('>>>>>>>:').strip() #去除输入选项连边的空格 if len(choice) == 0: #通过len的长度来判断用户是否输入了 continue if choice in current_layer: pre_menu.append(current_layer) current_layer = current_layer[choice] elif choice == 'b': if len(pre_menu) > 0: #通过大于0 来判断,还有目录可退 current_layer = pre_menu.pop() #利用pop来弹出上面的一层。 elif choice == 'q': exit() 作业二 list的小练习:实现购物车功能 product_list = [['iphone'

【机器学习_5】Anaconda:初学Python、入门机器学习的首选

若如初见. 提交于 2020-02-05 04:50:50
Anaconda是一个用于科学计算的Python发行版,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。 集成包功能: NumPy: 提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用,Python创建的所有更高层工具的基础,不提供高级数据分析功能 Scipy: 依赖于NumPy,它提供便捷和快速的N维向量数组操作。提供模块用于优化、线性代数、积分以及其它数据科学中的通用任务。 Pandas: 基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,包含高级数据结构,以及和让数据分析变得快速、简单的工具 Matplotlib: Python最著名的绘图库 Scikit-Learn: 是Anaconda中集成的开源机器学习工具包,主要涵盖分类,回归和聚类算法,可以直接调用传统机器学习的算法进行使用。 Anaconda也兼容Google开发的第二代人工智能系统 TensorFlow ,进行深度学习的开发。 参考: https://tianchi.aliyun.com/dataset/notebook/detail?spm=5176.12282042.0.0.26c9290aVRHXqk&postId=6239 来源: https://www.cnblogs.com/everda/p/10220600

关于汉诺塔的一些思考-Python/C

北战南征 提交于 2020-02-05 01:24:43
關於漢諾塔的一些思考-Python 漢諾塔規則 漢諾塔的傳説 如何移動 移動n個金盤需要的步驟 Python的遞歸實現算法-網傳寫法 另一個基於自己思考寫出來的Python實現 參考 漢諾塔規則 有三根杆子A,B,C。A杆上有 N 個 (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至 C 杆: 1.每次只能移動一個圓盤; 2.大盤不能疊在小盤上面。 漢諾塔的傳説 傳說越南河內某間寺院有三根銀棒,上串 64 個金盤。寺院裏的僧侶依照一個古老的預言,以上述規則移動這些盤子;預言說當這些盤子移動完畢,世界就會滅亡。 如何移動 如果n = 1 , 直接A -> C. 如果n = 2 , 稍稍複雜, A -> B, A -> C, B -> C. … Part1: 我們可以把移動n個金盤的問題分解爲三步驟: 1.把上面n-1個金盤從A柱移動到B柱上; 2.把第n個金盤從A柱移動到C柱; 3.最後把在B柱上的n-1個金盤移動到C柱上。 Part2: 至於如何將上面n-1個金盤從A柱移動到B柱上,我們又可以把問題分解為三步驟: 1.把上面n-2個金盤從A柱移動到C柱上; 2.把第n-1個金盤從A柱移動到B柱; 3.最後把在C柱上的n-2個金盤移動到B柱上。 Part3: 那麽問題又來了,如何將上面n-2個金盤從A柱移動到C柱上,我們又可以把問題分解為三步驟: … 綜上

Python学习,第八课 - 函数

一个人想着一个人 提交于 2020-02-04 21:55:42
本次讲解函数,由于内容比较多,小编列了个大纲,主要有一下内容: 1. 函数基本语法及特性 2. 函数参数 3.局部变量 4. 返回值 5.嵌套函数 6.递归 7.匿名函数 8.高阶函数 9.内置函数 1. 函数基本语法及特性 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 函数的特性: 减少重复代码 使程序变的可扩展 使程序变的易维护 函数的语法定义 直接上代码: # def 是定义函数的关键字 def test():#test既是函数名 print('学习Python的第一个函数') test() #调用函数 同时函数也可以带参数 a, b = 1, 3 # 带参函数 def test(x, y): # x 和 y 即是在我们调用函数时传入的参数 return x + y # 返回执行的结果 c = test(a, b) # 把函数返回结果赋值给 C print(c) 2. 函数参数 在说函数参数前,大家需要了解一个知识点, 形参 & 实参 何为形参? 既变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因此,形参只在函数内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量 何为实参? 既可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值

最全知乎专栏合集:编程、python、爬虫、数据分析、挖掘、ML、NLP、DL...

与世无争的帅哥 提交于 2020-02-04 17:39:24
上一篇文章 《爬取11088个知乎专栏,打破发现壁垒》 里提到,知乎官方没有搜素专栏的功能,于是我 通过爬取几十万用户个人主页所关注的专栏从而获取到11088个知乎专栏 。 本回筛选出其中涉及: 编程、python、爬虫、数据分析、挖掘、ML、NLP、DL等 关键词的专栏, 按照排名、关注人数、专栏名称、专栏简介等顺序,罗列出史上最全专栏合集 ,以供大家顺藤摸瓜、前去观摩和学习。 筛选出来的专栏数据和全部11088个专栏数据,已经绑定到公众号“牛衣古柳”(ID:Deserts-X)后台 。本文可能遗漏少数优质专栏,可在原始数据里自行挖掘;对其他主题专栏感兴趣的也可自行筛选和整理;有兴致搞个“专栏”搜索功能的小伙伴可以尝试下! 另外 已开始对11088个专栏里更详细的数据进一步爬取 ,之后会挖掘更多数据,超详细数据集也会随后分享。 TOP29系列,1万+关注: 排名,关注人数,专栏名称,专栏简介: No.1, 157960, 数据冰山 , 微信公众号:数据冰山 (No.2, 112088, 学习编程 ,莫道君行早,更有早行人。全心敲代码,天道自酬勤)(不小心漏了 @路人甲 的TOP2专栏,简直蠢哭) No.2, 62106, 行为与认知神经科学 , 神经科学 | 认知科学 I 脑机接口 | 人工智能 No.3, 50136, 机器之心 , 关注人工智能学术和技术实现 No.4,

python(十四)新式类和旧式类

谁都会走 提交于 2020-02-04 14:08:23
这里有个重要概念呢在下面那个链接 http://blog.csdn.net/zimou5581/article/details/53053775 http://www.cnblogs.com/btchenguang/archive/2012/09/17/2689146.html 1、新式类都从object继承,经典类不需要。 2、新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索 3、新式类相同父类只执行一次构造函数,经典类重复执行多次。 ( Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object ) 一个旧式类的深度优先的例子 class A(): def foo1(self): print "A" class B(A): def foo2(self): pass class C(A): def foo1(self): print "C" class D(B, C): pass d = D() d.foo1() # A 按照经典类的查找顺序 从左到右深度优先 的规则,在访问 d.foo1() 的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(

python 类学习笔记

血红的双手。 提交于 2020-02-04 13:49:21
Python的类机制使用尽可能少的新语法和语义将类引入语言。Python的类提供了面向对象程序设计语言所有的 标准特性:类继承机制允许有多个基类,一个派生类可以覆盖基类中的任何方法,一个方法可以使用相同的名字调用 基类中的方法。 Table of Contents 1 名字和对象 2 Python的域(scopes)和名称空间(namespaces) 3 初识类 3.1 定义类 3.2 类对象 3.3 实例化对象 3.4 方法对象 4 漫谈 5 派生 6 多重继承 7 私有变量和类局部引用 8 结构体 9 异常(Exceptions)也是类 10 迭代器 11 生成器(Generators) 1 名字和对象 对象有其特性,同一个对象可以有多个名字,这与其它语言中的别名很相似。别名有时候像指针,例如将对象当做 函数参数传递的时候非常高效,因为只传递了指针,这避免了pascal中的两套参数传递机制。 2 Python的域(scopes)和名称空间(namespaces) 在引入类之前,我们讲Python的域规则。类的定义巧妙地运用了名称空间,所以你需要知道域和名称空间如何工作才能理解发生了什么。 首先从定义开始。 名称空间是名字和对象之间的映射。多数名称空间使用Python的字典来实现,但 除非出于性能考虑,我们 通常不关心具体如何实现。名称空间的例子有,内置的名称例如abs()

python的递归

China☆狼群 提交于 2020-02-04 11:39:27
二、 递归 2.1递归的应用场景 递归是一种编程思想,应用场景: 1在我们日常开发中,如果要遍历一个文件夹下的所有文件,通常使用递归来实现; 2在后续的算法中很多算法都离不开递归,例如快速排序 2.1.1递归的特点 函数内部自己调用自己 必须有出口 def sum_number ( i ) : if i == 1 : #出口 return 1 return i + sum_number ( i - 1 ) resoult = sum_number ( 3 ) print ( resoult ) 三、lambda表达式 3.1lambda得应用场景 如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化 3.2lambda语法 lambda . 参数列表 :表达式 注意: lambda表达式得参数可有可无,函数得参数在lambda表达式中完全使用。 lambda表达式能接受任何数量的参数但只返回一个表达式的值 快速入门 def fn1 ( ) : return 200 print ( fn1 ) print ( fn1 ( ) ) #lambda 匿名函数 fn2 = lambda : 100 print ( fn2 ) print ( fn2 ( ) ) """ <function fn1 at 0x00000135323AD268> 内存地址 200