自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

人工智能AI技术

专注于人工智能AI技术的研发和教育

  • 博客(349)
  • 收藏
  • 关注

原创 人工智能教程 - 前言

所以我主张快乐学习,尽量加入搞笑的成分在教程里面,其实我生活中就很乐观幽默,歌手李健就是我性格的一个写照吧,只不过我能说荤段子他不能。我希望通过这一系列的教程使越来越多的中国人掌握人工智能技术,人工智能是中国的一次机遇,国家已经认识到了这一点并将人工智能提升到了国家战略级别。十四年前就认定了人工智能专业,一路学习着,从国内学到了国外,然后又回到了祖国参加工作,继续着对人工智能的研究!教程涉及到了人工智能的方方面面,从基础原理到现在很火的人脸识别,自动驾驶.,股票预测,金融分析…那么,让我们开始吧!

2020-07-28 10:33:50 992371 69

原创 python系列教程221——模块

这份手册在Python安装后就可以看到(通过Windows上的IDLE或“Python Start”按钮),或者也可以使用http://www.python.org的在线版本。文件b.py和c.py是模块,a会导入b和c。a.py中的第二行语句调用了模块b中所定义的函数spam,使用了对象属性语法。有下面几种导入方式。

2024-04-12 16:22:19 237

原创 python系列教程220——哪种迭代最快

我们已经学习了多种迭代工具方法,那么哪一种工具最快呢?

2024-04-02 16:53:04 1136

原创 python系列教程219——生成器是单迭代器对象

对于生成器函数来说,也是如此,如下的基于语句的def等价形式只支持一个生成器并且在一次迭代之后用尽。这与某些内置类型的行为不同,它们支持多个迭代器并且在一个迭代器中反映它们的原处修改。此外,一旦任何迭代器运行到完成,所有的迭代器都将用尽。

2024-02-26 16:16:05 335 1

原创 python系列教程218——生成器表达式

注意,如果生成器表达式是在其他的括号之内,在这种情况下,生成器自身的括号就不是必须的了。从语法上来讲,生成器表达式就像一般的列表解析一样,但是它们是括在圆括号中而不是方括号中的。虽然结果一样,但是从执行过程上来讲,生成器表达式很不相同:不是在内存中构建结果,而是返回一个生成器对象,这个对象支持迭代协议。

2024-01-09 17:01:33 491

原创 python系列教程217——生成器函数

yield语句挂起该函数并向调用者发送回一个值,当再次调用这个生成器函数时,它里面的yield语句会接着上次的状态并且再次产生一个值返回给调用者。得到的是一个生成器对象,它支持迭代器协议,也就是说,生成器对象有一个__next__方法,它可以开始这个函数,或者从它上次yield值后的地方恢复,并且在得到一系列的值的最后一个时,产生StopIteration异常。上面的解释还是比较难理解的,大家看如下代码再来慢慢理解,下面代码定义了一个生成器函数,这个函数将会用来不断地生成一系列的数字的平方。

2023-11-23 17:50:04 267

原创 python系列教程216——何时用列表解析

虽然列表解析比较复杂度,但是它却有可观的性能优势:map调用比等效的for循环要快两倍,而列表解析往往比map调用要稍快一些。速度上的差距是来自于底层实现上的,map和列表解析是在解释器中以C语言的速度来运行的,比Python的for循环代码在PVM中步进运行要快得多。

2023-10-22 17:23:03 284

原创 python系列教程215——列表解析与矩阵

虽然这种结构通过行来存储矩阵,但是我们能够简单地通过对行进行迭代,然后从所需要的列中提取出元素,或者就像下面一样通过在行内的位置进行迭代。下面的表达式使用range来生成列表的偏移量,之后使用相同的行和列来进行索引,取出了M[0][0],之后是 M[1][1](这里我们假设矩阵有相同数目的行和列)。

2023-09-17 17:19:00 447

原创 python系列教程214——列表解析与for和if

如果你对一个复杂的列表解析有什么困惑的话,你可以将列表解析的for和if分句在其中进行嵌套(将后来的分句缩进到右边),从而得到等效的语句。使用了if分支的列表解析能够当成一种与内置的filter类似的工具,它们会在分支不是真的情况下跳过一些序列的元素。这个表达式排列了从0~4的偶数与从0~4的奇数的组合。实际上,你可以在一个列表解析中编写任意数量的嵌套的for循环,并且每一个都有可选的关联的if分支。通用的列表解析的结构如下所示。当for分句嵌套在列表解析中时,它们工作起来就像等效的嵌套的for循环语句。

2023-09-10 15:25:53 256

原创 python系列教程213——列表解析与map

简而言之,列表解析会把任意一个表达式而不是一个函数应用于一个迭代对象中的元素。列表解析在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。它的简单形式是在方括号中编写一个表达式,在后边跟随着的看起来就像一个for循环的头部一样的语句。现在,假设我们希望收集整个字符串中的所有字符的ASCII编码。

2023-08-22 11:52:55 180

原创 python系列教程212——函数式编程

reduce在Python 2.6中只是一个简单的内置函数,但是在Python 3.0中则位于functools模块中,要更复杂一些。内置的operator模块提供了一些函数,它们使用起来是很方便的(要了解关于这一模块的更多内容,请参阅Python的库手册)。下面是一个对第一个调用的for循环的等效实现。

2023-08-12 16:47:10 216

原创 python系列教程211——map

别忘了,map在Python 3.0中是一个可迭代对象,因此,在这里,我们用一个列表list调用来迫使它生成所有的结果以显示,这在Python 2.6中不是必需的。尽管如此,因为map是内置函数,所以有一些性能方面的优势(简而言之,它要比自己编写的for循环更快)。所以尽管我们也能够来模拟map,但是当有速度优势的内置函数已经提供了这样的功能,再去模拟,意义不是很大。因为这是一个常见的操作,Python已经为我们提供了一个内置的工具函数——就是map函数。它会对一个序列对象中的每一个元素应用被传入的函数。

2023-08-05 17:26:26 217

原创 python系列教程210——嵌套lambda

在下面的例子中,在上层函数调用的时候,嵌套的lambda能够获取到在上层函数作用域中的变量名x的值。考虑到可读性,通常来说,最好避免使用嵌套的lambda。

2023-07-19 21:24:29 1163

原创 python系列教程209——复杂的lambda语句

由于lambda的主体必须是单个表达式(而不是一些语句),所以如果想要将更多的逻辑封装到一个lambda中,就需要一些技巧。例如,如果你希望在lambda函数中进行print,就应该直接编写sys.stdout.write(str(x)+‘\n’)这个表达式,而不是使用print(x)这样的语句。类似地,要在一个lambda中嵌套逻辑,可以使用前面介绍过的if/ else三元表达式,或者对等的但需要些技巧的and/or组合。一般来说,简洁优于复杂,明确优于晦涩,而且一个完整的语句要比神秘的表达式要好。

2023-05-25 09:58:03 302

原创 python系列教程208——为什么要使用lambda

同样,上面代码会实现相同的功能,但是def也许会出现在文件中的任意位置,即使它们只有很少的代码。类似刚才lambda的代码,提供了一种特别有用的可以在单个情况出现的函数:如果这里的三个函数不会在其他的地方使用到,那么将它们的定义作为lambda嵌入在字典中就是很合理的了。如果不是用lambda做这种工作,需要使用三个文件中其他地方出现过的def语句来替代,也就是在这些函数将会使用的那个字典外的某处需要定义这些函数。通常来说,lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义。

2023-04-02 17:36:00 626 4

原创 python系列教程207——匿名函数lambda

这是有意设计的——它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名。•lambda是一个表达式,而不是一个语句。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名。由lambda表达式所返回的函数对象与由def创建并赋值后的函数对象工作起来是完全一样的,但是lambda有一些不同之处让其在扮演特定的角色时很有用。

2023-03-11 20:29:32 337

原创 python系列教程206——函数注释

对于返回值,它们编写于紧跟在参数列表之后的一个->之后。如果编写了注解的话,仍然可以对参数使用默认值——注解出现在默认值之前。

2023-02-23 16:16:50 597

原创 python系列教程205——函数属性

这样的属性可以用来直接把状态信息附加到函数对象,而不必使用全局、非本地和类等其他技术。和非本地不同,这样的属性可以在函数自身的任何地方访问。从某种意义上讲,这也是模拟其他语言中的“静态本地变量”的一种方式——这种变量的名称对于一个函数来说是本地的,但是,其值在函数退出后仍然保留。由于函数是对象,所以函数比我们所预料的更灵活。

2023-02-10 16:48:32 350

原创 python系列教程204——灵活的函数

由于Python函数是对象,所以函数对象可以赋值给其他的名字、传递给其他函数、嵌入到数据结构、从一个函数返回给另一个函数,等等,就好像它们是简单的数字或字符串。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

2023-01-26 15:29:36 296

原创 python系列教程203——必须使用递归

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!嵌套的循环语句也不够用,因为子列表可能嵌套到任意的深度并且以任意的形式嵌套。尽管出于简单性和高效率的目的,对于线性迭代通常应该使用循环语句而不是递归,但我们会发现像上面示例一样的必须使用递归的情况还是很多的。在前面的文章中,我们说到了可以使用循环语句来替代递归。但是,有时候必须使用递归,或者说使用递归才是更方便的解决方案。

2023-01-15 19:50:00 426

原创 python系列教程202——循环语句与递归

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;如果用循环语句取代递归,我们就不需要在调用堆栈上针对每次迭代都有一个本地作用域的副本,并且,我们还避免了一般会与函数调用相关的速度成本。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

2022-12-08 15:43:03 459

原创 python系列教程201——递归函数

然而,它是一项应该了解的有用的技术,因为它允许程序遍历拥有任意的、不可预知的形状的结构。递归甚至是简单循环和迭代的替换,尽管它不一定是最简单的或最高效的一种。在每一层,这个函数都递归地调用自己来计算列表剩余的值的和,这个和随后加到前面的一项中。当像这样使用递归的时候,对函数调用的每一个打开的层级,在运行时调用堆栈上都有自己的一个函数本地作用域的副本,也就是说,这意味着L在每个层级都是不同的。正如你所看到的,在每个递归层级上,要加和的列表变得越来越小,直到它变为空——递归循环结束。

2022-11-26 19:56:13 525

原创 python系列教程200——keyword only参数

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;出现在参数列表中的*args之后的所有参数都必须在调用中使用关键字语法来传递。Python 3.0的Keyword-Only参数就是指必须只按照关键字传递参数。字符,来表示一个函数不会接受一个变长的参数列表,并且要求跟在。

2022-11-10 16:35:15 566

原创 python系列教程199——解包参数

调用时会解包参数的集合,而不是创建参数的集合。相似地,在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。另外,我们在调用中能够以非常灵活的方式混合普通的参数、基于位置的参数以及关键字参数。

2022-10-24 17:24:33 1109 2

原创 python系列教程198——任意数目的参数

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!将这些关键字参数传递给一个新的字典,这个字典之后将能够通过一般的字典工具进行处理。在这种情况下,** 允许将关键字参数转换为字典,你能够在之后使用键调用进行步进或字典迭代,如下段程序所示。当这个函数调用时,Python将所有位置相关的参数收集到一个新的元组中,并将这个元组赋值给变量args。下面先举例说说*的用法。

2022-10-08 20:13:10 844

原创 python系列教程197——默认参数

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;当调用这个函数的时候,我们必须为a提供值,无论是通过位置参数还是关键字参数来实现。如果没有传入值的话,在函数运行前,参数就被赋了默认值。这里,a通过位置得到了1,c通过关键字得到了6,而b,在两者之间,通过默认值获得2。

2022-09-25 15:25:58 446

原创 python系列教程196——参数匹配

更准确地讲,Python将调用中的变量名c匹配给在函数定义头部的名为c的参数,并将值3传递给了那个参数。实际的效果就是这个调用与上一个调用的效果一样,但是注意到,当关键字参数使用时参数从左至右的关系不再重要了,因为参数是通过变量名进行传递的,而不是根据其位置。在这种情况下,所有基于位置的参数首先按照从左至右的顺序匹配头部的参数,之后再进行基于变量名进行关键字的匹配。这种形式的调用要比直接进行一个由逗号分隔的三个值的调用明了得多:关键字参数在调用中起到了数据标签的作用。

2022-09-19 15:17:31 572

原创 python系列教程195——返回多个值

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!更通用的序列赋值(例如,def f((a,[b,c])):)在Python 2.6中因语法问题而无效,并且必须用显式赋值形式。看起来这里的代码好像返回了两个值,但是实际上只有一个:一个包含有2个元素的元组,它的圆括号是可选的,这里省略了。顺带说一下,在Python 2.6中,可以在传递给函数的参数中自动解包元组。

2022-09-13 15:15:08 838

原创 python系列教程194——避免改变参数

但它的知识点还是讲到位的了,也值得阅读!在Python中,默认通过引用(也就是指针)进行函数的参数传递,是因为这通常是我们所想要的:这意味着不需要创建多个拷贝就可以在我们的程序中传递很大的对象,并且能够按照需要方便地更新这些对象。如果不想要函数内部的修改影响传递给它的对象,那么,我们可以简单地创建一个拷贝,如下面的代码所示,利用分片的方式创建了L的拷贝。除了上面的两种方式外,我们还可以将传入的对象转换成元组,元组是不可变对象,如果函数内部有代码想要改变元组,那么就会抛出异常。当然也可以在函数内部进行拷贝。

2022-09-02 10:17:02 611

原创 python系列教程193——参数传递

但它的知识点还是讲到位的了,也值得阅读!实际上,changer中的第二条赋值语句没有修改b,我们修改的是b当前所引用的对象的一部分。•因为a是在函数作用域内的本地变量名,第一个赋值对函数调用者没有影响,它仅仅把本地变量a修改为引用一个完全不同的对象,并没有改变调用者作用域中的名称X的绑定。在这个例子中,在使用f(b)调用函数的时候,变量a赋值了对象88,但是,a只是存在于调用的函数之中。但是当参数传递像列表和字典这样的可修改对象的时候,对这样的对象的原处修改在函数退出后依然有效,并由此影响到调用者。...

2022-08-27 16:54:07 345

原创 python系列教程192——为什么要使用nonlocal

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的。在这个例子中,这是有效的,但它需要在两个函数中都有global声明。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

2022-08-20 17:16:21 535

原创 python系列教程191——nonlocal边界

和global语句不同,当执行一条nonlocal语句时,nonlocal名称必须已经在一个嵌套的def作用域中赋值过,否则将会得到一个错误

2022-08-12 15:05:48 227

原创 python系列教程190——nonlocal举例

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!如果我们在nested中把tester作用域中的state声明为一个nonlocal,我们就可以在nested函数中修改它了。每次调用都产生一个新的、独特的state对象,以至于更新一个函数的state不会影响到其他的。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!...

2022-08-09 13:16:27 442

原创 python系列教程189——global和nonlocal

分析其实这段代码真正执行的时候是会报错的,提示在第三行的位置var未定义,这是因为第一行定义的var为全局变量,而在第三行中=右侧的var为局部变量,此变量在函数局部内确实未定义,这就是这段代码报错的原因,解决这个问题的方法就是在第三行代码之前,用global关键将var声明为全局变量。如下代码,虽然使用global声明var,但是代码还是报错的,这是因为这里的var变量并不是全局变量,同时在最内层函数中也不是局部变量,在这种情况下就需要nonlocal关键字类声明。2、nonlocal的作用。......

2022-08-01 21:16:51 302

原创 python系列教程188——内嵌函数

声明在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!但它的知识点还是讲到位的了,也值得阅读!下面的代码就是前边例子的等效性形式,这段代码就避免了使用嵌套。我们得到的是生成的内嵌函数的一个引用。这个内嵌函数是通过运行内嵌的def而创建的。这定义了一个外部的函数,这个函数简单地生成并返回了一个嵌套的函数。PS看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!...

2022-07-27 18:26:03 296

原创 python系列教程187——嵌套作用域

def是一个简单的可执行语句,可以出现在任意其他语句能够出现的地方,包括嵌套在另一个def之中。这个def生成了一个函数,并将其赋值给变量名f2,f2是f1的本地作用域内的一个本地变量。在此情况下,f2是一个临时函数,仅在f1内部执行的过程中存在(并且只对f1中的代码可见)。在增加了嵌套的函数作用域后,变量的查找法则变得稍微复杂了一些。因为函数能够在整个def声明内获取变量名,通过LEGB查找法则,f2内的x自动映射到了f1的x。在这个代码中,我们命名为f2的函数的调用动作的运行是在f1运行后发生的。...

2022-07-18 12:43:08 941

原创 python系列教程186——访问全局变量

由于全局变量构成了一个被导入的对象的属性,我们能够通过使用导入模块并对其属性进行赋值来访问全局变量

2022-07-12 19:40:33 561

原创 python系列教程185——不要直接修改其他文件的变量

尽管我们能够直接修改另一个文件中的变量,但是往往我们都不这样做。

2022-07-09 14:36:10 289

原创 python系列教程184——尽量少用全局变量

在默认情况下,函数内部赋值的变量名是本地变量,所以如果希望在函数外部对变量进行改变,就必须添加额外的代码——global语句。但是将其改为全局变量会引发一些软件工程问题:由于变量的值取决于函数调用的顺序,而函数自身是任意顺序进行排列的,导致了程序调试起来变得很困难。...

2022-07-02 11:13:16 534

原创 python系列教程183——global语句

global语句是Python中唯一看起来有些像声明语句的语句。但是,它并不是一个类型或大小的声明,它是一个命名空间的声明。它告诉Python函数打算生成一个或多个全局变量名。也就是说,存在于整个模块内部作用域(命名空间)的变量名...

2022-06-27 21:57:24 789

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除