自定义博客皮肤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技术的研发和教育

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

原创 人工智能教程 - 前言

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

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

原创 Python系列教程241——不要使用from *

使用from module import * 语句时,由于你不会列出想要的变量,所以可能会意外覆盖了作用域内已使用的变量名。

2025-03-14 17:08:42 313

原创 Python系列教程240——as语法

先来个栗子解答上面的问题,假设你有个朋友叫尼古拉斯·赵四·亚历山大·夫斯基,每次喊他都得念全名,舌头都会打结的。另外as也经常被用来避免变量名冲突。就像班里两个人都叫"李华",老师只能给他们起个别名,例如喊"第一排李华"和"戴眼镜李华"。此外,当使用前面我们学过的包导入功能时,也可为整个目录路径提供简短、简单的名称,十分方便。

2025-03-14 17:01:53 409

原创 Python系列教程239——动态修改模块搜索路径

保存在操作系统中,不是执行中的Python程序,因此这两种配置方法更全局一些:机器上的每个程序都会去查找PATHONPATH和.pth,而且在程序结束后,它们还存在着。例如,上一个例子中,我们从路径中删除了Python的源代码库目录的话,我们就再也无法使用string模块了。

2025-03-12 17:14:56 199

原创 Python系列教程238——__name__

这种写法非常的方便简洁,但是有一个问题,那就是无论是我们自己单独运行这个脚本,还是每次这个文件被另一个文件导入时,都会出现调用自我测试所得到的输出。我们修改一下前面的代码,改成在__name__检查区块内封装自我测试的代码,使其在文件作为顶层脚本执行时才会启动,而导入时则不会。

2025-03-12 17:01:15 430

原创 python系列教程237——启动扩展功能

这个语句一般应该出现在模块文件的顶端,因为遇到这一句代码后,就会对这个文件开启特殊的代码编译。此外,在交互模式提示符下提交这个语句也是可以的,从而能够实验新版本的语言变化。一般来说,新版本的功能会以扩展功能的形式出现在旧版本里面。万事万物都在不断地升级,编程语言也一样,例如Python 3.0就是Python 2.6的升级。

2024-12-30 15:13:22 384

原创 python系列教程236——隐藏变量

注意,注意,上面的“隐藏”只对from *语句有效,对import语句是无效的。就是说,我们还是可以使用import语句来导入那些带下划线的变量,也可以导入那些不在__all__列表中的变量。这句代码的意思是,只有名为Error,encode,decode的变量会被from *语句导出,其它变量都对from *语句免疫。

2024-12-30 15:02:33 412

原创 Python系列教程235——相对导入

在Python 3.0版本后,它只搜索当前的包,如果当前包中没有名为spam的模块,导入就失败了。如果没有相对导入这么一个技术,那么我们将永远无法导入标准库里的string模块,因为上面的代码首先会找到当前包mypkg中的string。有了相对导入这么一个规定,上面的语句就不会搜索mypkg包,那么就会找到标准库里的string。例如你要导入其它包中的模块,那就不是相对导入,而是绝对导入。上面代码的意思是,从当前包中找到一个名为spam的模块,然后导入里面名为name的变量。这就是为什么要使用相对导入!

2024-11-18 16:18:53 579

原创 Python系列教程234——为什么要使用包导入技术?

如果没有套套,你可能就会因为一个不小心而想起那个经典的广告“不是我不小心,只是真情难以抗拒,某某某医院,无痛人流,留住你的产权”。声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!不应该像上面那样在目录内把文件安装成单纯的文件列表,而是应该将它们进行打包,也就是多加个__init__.py文件

2024-11-18 16:07:37 718

原创 Python系列教程233——包导入时使用import还是from

此时,有老粉丝可能会骂我“瞎JB扯蛋,之前在《Python系列教程227——使用import还是from》的文章中还说推荐使用import,现在怎么又说推荐使用from了呢”。例如,在前面文章的例子中,如果我们使用import语句,在每次要得到z时,就得从dir1开始重新输入完整路径,并且每次都要重新执行整个路径。

2024-11-12 11:04:58 580

原创 Python系列教程232——包导入实例

此外,就像模块文件一样,任何已导入的目录也可以传递给reload,来强制该目录重新被执行。下列给出了三个包含简单代码的文件,它们分别位于目录dir1和dir2中——这些文件的路径名会在注释中给出(老铁!这里,dir1要么是我们工作目录的子目录(工作目录就是程序代码所在的目录),要么就是位于模块搜索路径中的一个目录的子目录。

2024-11-12 10:55:08 213

原创 python系列教程231——__init__.py

如果选择使用包导入,就必须多遵循一条约束:包导入语句的路径中的每个目录内都必须有__init__.py这个文件,否则导入包会失败。它会只加载该目录的__init__.py文件中赋值语句定义的变量名,包括该文件中程序代码明确导入的任何子模块。例如,导入后,表达式dir1.dir2会返回一个模块对象,而此对象的命名空间包含了dir2的__init__.py文件内所赋值的所有变量名。作为一个高级功能,你可以在__init__.py文件内使用__all__列表来定义目录以from* 语句形式导入时,需要导出什么。

2024-09-02 17:37:42 1016

原创 python系列教程230——包导入

这个目录就称为包,因此,这类导入就称为包导入。这些语句中的“点号”路径是对应于机器上目录层次的路径,通过这个语句可以导入文件mod.py。也就是说,上面的语句是表明了机器上有个目录dir1,而dir1里有子目录dir2,而dir2内包含有一个名为mod.py的模块文件。此外,这个导入意味着,dir1位在某个容器目录dir0中,这个目录可以在Python模块搜索路径中找到。容器目录dir0需要添加在模块搜索路径中(除非这是顶层文件的主目录,就是放启动文件的那个目录,也就是程序的当前目录)。

2024-09-02 17:37:15 686

原创 python系列教程229——reload重载

例如,必须在启动时通过网络连接服务器的系统,就是动态重载的一个非常重要的应用场景。当然,并非所有系统都需要这种动态的实现,但对那些需要的系统而言,模块重载就提供了一种易于使用的动态定制工具。声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!在下面这个例子中,我们要修改并重载一个模块文件,但是不会中止交互模式的Python会话。我们得调用reload,才能够获取新的版本。

2024-08-19 15:54:25 622

原创 python系列教程228——模块是什么鬼?

例如,假设模块文件M.py的顶层有一个像X = 1这样的赋值语句,而变量名X会变成M的属性,我们可在模块外以M.X的方式对它进行引用。在导入时,文件顶层(不在def或class之内)赋值变量的语句(例如,=和def),会建立模块对象的属性,赋值的变量名会存储在模块的命名空间内。系统中,文件在第一次导入时无论在什么地方,Python都会建立空的模块对象,并逐一执行该文件内的语句,依照文件从头到尾的顺序。在一个代码文件的顶层(也就是不在函数或类的主体内)每一个赋值了的变量名都会变成该模块的属性。

2024-08-11 11:55:35 331

原创 python系列教程227——使用import还是from

就像在夜场里,你跟你女朋友去玩,碰巧有另外一个女的跟你女朋友穿了同样的衣服,你以为他是你女朋友,你上去就摸了一把,结果却不是你女朋友,摸错人了。但是无论如何,我觉得在一个大型的多人协作的系统中,尽量使用inport语句,这样会避免很多潜在问题的发生,也有利于系统代码后期的维护。另外一个潜在的威胁就是,当使用reload的时候。

2024-08-06 11:50:14 438

原创 python系列教程226——如何改变其它文件中的变量

使用import是导入了整个文件,也就是把整个文件当成了一个可变对象,所以改变这个可变对象内的变量就会影响到原始文件。就像函数的参数,对已取出的变量名重新赋值,对于其复制之处的模块并没有影响”,那么我们如果想要改变其它文件中的变量的值要怎么操作呢?PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

2024-07-28 08:00:10 358

原创 python系列教程225——import和from居然是赋值语句

就像def一样,import和from是可执行的语句,而不是编译期间的声明,而且它们可以嵌套在if测试中,出现在函数def之中等,直到执行程序时,Python执行到这些语句,才会进行解析。赋值语句方面的知识都适用于模块的读取。就像函数的参数,对已取出的变量名重新赋值,对于其复制之处的模块并没有影响,但是修改一个已取出的可变对象,则会影响导入的模块内的对象。此处,x并不是一个共享的可变对象,但y是的。导入者中的变量名y和被导入者都引用了相同的列表对象,所以在其中一个地方的修改,也会影响另一个地方的这个对象。

2024-06-06 17:44:16 505

原创 python系列教程224——导入只发生一次

在默认的情况下,Python只对每个文件的每个进程做一次操作。第二次和其后的导入并不会重新执行此模块的代码,只是从Python内部模块表中取出已创建的模块对象。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

2024-05-24 11:24:08 562

原创 python系列教程223——模块的创建与使用

创建一个Python模块非常非常简单,只需要使用文本编辑器,把一些Python代码输入至文本文件中,然后以“.py”为后缀名进行保存,就会被自动认为是Python模块。上面两个例子有着相同的效果,但是from语句出现时,导入的变量名会复制到作用域内,在脚本中使用该变量名就可少输入一些:我们可直接使用变量名,而无须在嵌套模块名称之后。当我们使用*时,会取得模块顶层所有赋了值的变量名的拷贝。因为from会把变量名复制到另一个作用域,所以它就可以让我们直接在脚本中使用复制后的变量名,而不需要通过模块名称。

2024-05-08 15:41:16 473

原创 python系列教程222——模块导入

此外,如果Python在搜索路径上只发现了字节码文件,而没有源代码,就会直接加载字节码(这意味着你可以把一个程序只作为字节码文件发布,而避免发送源代码)。在这之后,导入相同模块时,会跳过这三个步骤,而只提取内存中已加载的模块对象。因此,通常不会看见程序顶层文件的.pyc字节码文件,除非这个文件也被其他文件导入:只有被导入的文件才会在机器上留下.pyc。因为最后的导入步骤实际上是执行文件的程序代码,如果模块文件中任何顶层代码确实做了什么实际的工作,你就会在导入时看见其结果。2.编译成位码(需要时)。

2024-04-22 12:32:08 631

原创 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 363

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

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

2024-04-02 16:53:04 1265

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

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

2024-02-26 16:16:05 448

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

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

2024-01-09 17:01:33 572

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

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

2023-11-23 17:50:04 329

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

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

2023-10-22 17:23:03 350

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

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

2023-09-17 17:19:00 576

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

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

2023-09-10 15:25:53 417

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

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

2023-08-22 11:52:55 274

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

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

2023-08-12 16:47:10 283

原创 python系列教程211——map

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

2023-08-05 17:26:26 280

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

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

2023-07-19 21:24:29 1337

原创 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 437

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

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

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

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

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

2023-03-11 20:29:32 418

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

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

2023-02-23 16:16:50 710

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

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

2023-02-10 16:48:32 428

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

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

2023-01-26 15:29:36 339

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

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

2023-01-15 19:50:00 522

空空如也

空空如也

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

TA关注的人

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