ag视讯

400-700-1307

为什么你理当学 Python ?

2019-01-26 10:11

第一次接触 Python 是在一节编程入门课上。其实,在此之前体味过它,所以在上课之前我对它的语法曾经很熟悉了,但在上课之前我没有用它做过真正的项目。虽然对它没有太大乐趣,但我认为把它引见给人们去进修编程还是很好的。我对它不是不爱好,而是一种“无所谓”的立场。启事很简单:它里面有太多“魔法”。 C 和 Java 这些言语,对底层的行为描述的很清晰,Python 则完全相反。
 
此外,Python 布局松散:写大型复杂法度时,碰着法例严谨的法度布局体(比如每个文件一个公共类),比其他言语(比如 Java )要费些力量。但是,在这些方面 Python 给了你很大的自由。
 
另一件事是严格的编码气概和调试:因为Python 是正文型言语,查找问题不太容易:若是C 言语有语法错误,编译器会间接遏制编译,但在正文型言语中,直到施行到问题行,问题才会被发觉。试着在需要整数的时候传一个字符串?cc 会登时提示你,Python 正文器却对此一点都不介意(虽然有东西能够发觉这个问题,比如 mypy,但我会商的是通用的Python)。我提到的这些问题是正文型言语的通病,并非 Python 独有,但这些是我不爱好它的次要启事。
 
还有一个烦人的问题是强制缩进。我们教员(很优良)认为这是功德情,因为“它强制我们构成精练的代码气概”。确实如斯,但还是有点烦,现代码没有按预期施行时,你阐发代码想要找出 bug,它却无影无踪,过了很长时间之后你发觉 if 语句那一行有一个多余的空格。
 
我曾经和同事聊过 Python,告诉他为什么我之前对这个言语不感冒,他笑着问我“问什么不爱好Python呢?因为它读起来很像英语?”。是的。因为这个言语做了良多底层的工作,有时候会不清晰发生了什么。举个读文件的例子,假设你想一行一行读取文件内容并打印出来。C 会这么做:
 
#include <stdio>
 
int main(void) {
    FILE *fp;
    char buff[256]; // assuming a line won&#39;t contain more than 256 chars
    fp = fopen("hello.txt", "r");
 
    while(fgets(buff, 256, fp)) {
        printf("%s", buff);
    }
 
    fclose(fp);
    return 0;
}
 
python 这么做:
 
with open(&#39;hello.txt&#39;) as f:
    for line in f:
        print(line)
 
此刻,良多人会认为这是 python 的劣势,然而,第一个例子中,干了什么一目了然:
 
获取一个文件指针
从文件读取每一行数据到缓存中,打印缓存中的内容
封锁文件流
 
python 的例子中看不到这些,它是一种 “魔法般的”过程。此刻,有人认为这是功德,因为将法度员与底层实现细节隔离(我同意这个说法),但我想晓获得底发生了什么。
 
风趣的是,我以上提到的缺点,我此刻认为都是好处。为了公允起见,我强调,Python 里边没有魔法,若是你多体味一点,你会发觉真的没有,有的只是言语正文代码的编制,从这点来看,我发觉它挺成心义的。若是你也这么感受,我建议你深切体味它的工作机制,若是有东西像魔法,就找出来到底发生了什么,工作就会变得清晰,魔法就变成了便当。
 
我的认识发生很大的变化,出格是我决定操纵 Python 后,现实上我此刻是 Python 的死忠!此刻你也许会想我将会在哪里说服你学 Python 是个好主见,不要担心,登时就到。作为引言的结尾,我想申明,这只是我对这个言语的小我感受,只是小我偏好。我没有试图以“若是你用 Python,你就不是真正的法度员(现实上,我不这么认为)”的出处挽劝人们学 C。当有人问我他们的入门言语该被选哪个,我凡是建议他们选 Python,基于我上边提到的“缺点”的启事。我的感受来历于我的乐趣,我曾经在做一些很底层的东西,你能想到,Python 并不合用。
 
Python 言语精髓
 
在借用了JavaScript 畅销书 《JavaScript 言语精髓》作为本节题目后,我们起头会商本文的主题:为什么你(没错,就是你!)理当学 Python。
 
1、通用脚本言语
 
这是我操纵 Python 的次要启事。我曾经和良多人做过良多项目,不合的人用不合的系统。就我而言,我经常在windows系统和linux系统之间切换。举一个现实的例子,有一个项目,我写了项目的主动测试脚本,功能发觉只需我能用,因为是用 PowerShell 写的,而我是项目中独一操纵 Windows 的。当时同事们天然认为 bash 是最好的,我还向他们正文 PowerShell 遵照一种不合的模式并且有它的强项(例如,它供给了 .NET 框架接口),它是面向对象的脚本言语,和 bash 完全不一样。此刻我不想会商哪个更好,因为这不是本文的重点。
 
那么这个问题若何措置呢?嗯…此刻,可否有一种脚本言语能够在所有支流平台上运转呢?你猜对了,它就是 Python。除了能够在支流平台上运转,它还是开箱即用的脚本言语。标准库包含不少合用法度,供给了独立于系统的常用接口。举一个精练了然的例子,假设你想获取文件夹下所有文件的文件名,然后对其进行措置,在 UNIX下,你要这么做:
 
for f in *; do echo "rocessing $f file..."; done
 
用 PowerShell 做雷同的工作:
 
Get-ChildItem "." |
Foreach-Object {
    $name = $_.Name
    Write-Output "rocessing $($name) file..."
}
 
An equivalent functionality in Python can be achieved with:
 
python 这么做:
 
from os import listdir
 
for f in listdir(&#39;.&#39;):
    print(&#39rocessing {} file...&#39;.format(f))
 
此刻我认为,Python 除了能够跑在 Linux,MacOSX 和 Windows 上,它也很易读。上边例子中的脚本很简单,在复杂的例子中不合言语的易读性不同会更较着。
 
就像我之前提到的,Python 自带了良多强大的库用来代替 shell 脚本,你会发觉,最有用的是:
 
os – 供给系统无关功能,比如文件目次和文件读写。
subprocess – 发生新过程、与输入输出流和前去代码交互。能够用它来启动系统已安装的法度,但请记住若是你担心脚本的可移植性,这不是最好的选择。
shutil – 供给对文件和文件集结的高级操作。
argparse – 解析呼吁行参数,成立呼吁行接口。
 
好了,假设你 get 到了重点,跨平台和易读性听起来挺不错的,但是你真的爱好类 UNIX shell 雷同的语法若何办?告诉你个好动静,鱼和熊掌能够兼得!看看 Plumbum,它是一个 Python 模块,它的座右铭是“ 再也不写 shell 脚本”。它仿照了 shell 语法,同时保持了跨平台。
 
不要完全丢弃 shell 脚本
 
即便 Python 能够完全代替 shell 脚本,但也不是必需这么做,因为 Python 脚本生成适合 Unix 呼吁行理念,你要做的就是让它们从 sys.stdin (标准输入)读数据,向 sys.stdout(标准输出)写数据。举个例子,假设你有一个文件,每行有一个单词,你想晓得每个单词在文中呈现的次数。这种环境就没需要全数是用Python,我们能够操纵 cat 呼吁和我们的脚本,称它为 namecount.py 一路来完成这个任务。
 
假设有一个文件,名为 names.txt ,内容如下:
 
cat
dog
mouse
bird
cat
cat
dog
 
此刻操纵我们的脚本:
 
$> cat names.txt | namecount.py
 
Powershell:
 
$> Get-Content names.txt | python namecount.py
 
期望的输出如下(挨次可能会变化):
 
bird 1
mouse 1
cat 3
dog 2
 
namecount.py 源码:
 
#!/usr/bin/env python3
import sys
 
def count_names():
    names = {}
    for name in sys.stdin.readlines():
        name = name.strip()
 
        if name in names:
            names[name] += 1
        else:
            names[name] = 1
 
    for name, count in names.items():
        sys.stdout.write("{0}\t{1}\n".format(name, count))
 
if __name__ == "__main__":
    count_names()
 
无序的动静可读性差,你可能想按单词呈现的次数对其排序,让我们尝尝。我们要用管道输出文件内容供内建呼吁措置。按数字降序排序,我们要做的就是 $> cat names.txt | namecount.py | sort -rn 。若是操纵PowerShell 理当多么:$> Get-Content names.txt | python namecount.py | Sort-Object { [int]$_.split()[-1] } -Descending (你可能听到了 Unixer 的吐槽声了,PowerShell 若何这么繁琐)。
 
这回我们的输出是确定的,如下所示:
 
cat 3
dog 2
bird 1
mouse 1
 
(旁注:若是你用 PowerShell,cat 是 Get-Content 的别号,sort 是 Sort_object 的别号,所以以上呼吁能够写成:$> cat names.txt | python namecount.py 和 $> cat names.txt | python namecount.py | sort { [int]$_.split()[-1] } -Descending )
 
但愿我成功说服你 python 是你某些脚本的替代品,你不必完全丢弃 shell 脚本,因为你能够将 Python 融合到你现有的工作流和东西箱中,还能够从它跨平台,更好的可读性,还有丰厚的库中获益(后面会讲)。
 
2、大量优良的库
 
Python 有很是丰厚的库。我的意义是,几乎任何事都有库(风趣的是:若是你在你的Python 正文器中输入 import antigravity,在浏览器中打开 xkdc 漫画的页面,是不是很酷?)。我不是很推崇堆叠模块式的编程,但你不必多么。因为有太多的库,不暗示你都要操纵。我也不爱好堆叠模块(它有点像 CBSE),我在体味它们之后才操纵。
 
例如,我决定研究马尔科夫链,我想了一个项目:抓取一个艺术家的所有歌词,成立一个马尔科夫链,然后从此中生成歌曲。这个项目的目的是生成的歌曲理当能反映出艺术家的气概。所以我四周找相关的东西,搞出了 lyricst 项目(这只是个样品,还不成熟,只是一个测试项目,如我所言,我只是随便搞了一下,没想深切。若是你想玩的话,它包含有呼吁行界面和示例的申明文档)。我认为,最好的找歌词的处所是 RAPGenius,因为它很活跃,经常更新。
 
为了获取艺术家所有的歌词,我必需从网站上爬,然后措置 HTML。幸运的是,Python 很适合做收集爬虫,它有强大的库像 BeautifulSoup 能够措置 HTML。所以我是这么做的,先操纵 BeautifulSoup 从网页中抽取我需要的动静(就是歌词)然后用这些动静成立马尔科夫链。当然我曾经想用正则表达式成立本人的 HTML 解析器,但是这个库的具有让我更关怀项目的最终目的:把玩马尔科夫链,让它更风趣,例如说,从文件中读取些内容出来。
 
3、用来做渗入测试很强大
 
若是你在作渗入测试或仅仅是爱好玩玩,Python 是你的好辅佐!因为Python 在所有 LInux 和 MAC OS 机械上都有安装,还有丰厚的库,完满的语法,还是一门脚本言语,让它很适合干这个。
 
另一个我为什么决定操纵 Python 的启事(除了我之前提到的)是我对安然很感乐趣,Python 是用来做渗入测试的美满选择。我在第一次进入范畴是通过 Scapy(或 Scapy3k ,python3),我印象很深。Scapy 能够成立、监听、解析数据包。它的 API 很简单,文档也很完满。你能够很容易的成立不合层的数据(我指的是 OSI 模型)或者捕获它们对其进行阐发或编削。你以致能够导出 pcap 文件用 Wireshark 打开。虽然除了抓包还能做良多工作,还有良多其他的库也能够,但我在这里不会涉及,因为这不是本文的重点并且要展开讲的话需要一篇文章。
 
有人可能会说,“哦,太棒了,但我感乐趣的是 Windows 设备,里边不会自带 Python”。别留神,你能够用 py2exe 把你的脚本编译成 .exe 文件。文件可能会有点大(取决于你是用的库的数量),但这不是重点。
 
若是你很猎奇,请参考 list of Python pentesting tools。 文末我还保举了几本书。
 
4、黑客的言语
 
Python 是可塑性很强的言语。你能够用各类编制鼎新它。可拜见《 altering the way imports work》和《messing with classes before they are created》这两篇文章。这只是一些例子。也让它成为强大的脚本言语(在第一节有说)适合做渗入测试(第三节),因为它给了你很大的自由。
 
我不想讲太多,但我会讲述它让我惊讶的处所。当时,我在做一个收集爬虫( Python 很适合干这个!),我用的此中一个东西是 BeautifulSoup。 这是我用来进修 Python 的项目之一。Beautifulsoup 措置 HTML 的语法清晰直不雅,启事是在自定义行为方面,Python 给了你很大的自由。体味一番 API 后,发觉有 “魔法”。和这种环境雷同:
 
from bs4 import BeautifulSoup
 
soup = BeautifulSoup(&#39;<p class="someclass">Hello</p>&#39;, &#39;html.parser&#39;)
soup.p
 
上面的代码把持第一个字符串参数成立了一个 BeautifulsSoup 实例,第二个参数暗示我想操纵 Python 自带的 HTML 解析器(BeautifulSoup 能够搭配多种解析器)。soup.p 前去一个 Tag(bs4.element.Tag) 对象,暗示将作为第一个参数。
 
以上代码的输出是:
 
<p class="someclass">Hello</p>
 
此刻你可能会想,你说的魔法在哪?登时就来。魔法在于上面的代码能够被编削为任何标签,以致能够是自定义的。它意味着下面的代码也能够一般运转:
 
from bs4 import BeautifulSoup
soup = BeautifulSoup(&#39;<foobarfoo class="someclass">Hello</foobarfoo>&#39;, &#39;html.parser&#39;)
soup.foobarfoo
 
The output is the following:
 
输出如下:
 
<foobarfoo class="someclass">Hello</foobarfoo>
 
当我发觉多么也能运转,我的反映是“若何回事?”。因为,第一个例子很容易实现,我的意义是最间接的编制是为每一个 HTML 标签定义一个属性(实例变量),在解析过程中若是找到了,就赋值给它们。但是这对第二种环境不合用,不成能对所有的字符串定义属性。我想晓得它是若何实现的,所以我打开 BeautifulSoups 源代码起头寻找。 我没有发觉任何定名为 p 的属性,这一点也不奇异,解析函数没有对其赋值。谷歌一番后,我找到了谜底:魔法编制。什么是魔法编制,为什么要叫这个名字?现实上,魔法编制是给你的类付与魔法的编制。这种编制凡是前后有两条下划线(例如 __init__()),在Python文档的 DataModel model section 有对它的申明。
 
真正让 BeautifulSoup 具有这个功能的魔法编制是__getattr__(self, name)(self 在python 中指向实例,和 Java 中的this 雷同)。若是去查看文档,你会发觉第一段如下:
 
若是在属性常见处所找不到属性时,比如既不是实例属性,又没有在 self 类树中找到,则挪用该编制(object.__getattr__(self, name))。参数 name 就是属性名这个别例理当前去(算计过的)属性值或抛出 AttributeError 很是。
 
当你尝试访谒一个不具有的属性,对象的 __getattr__(self,name) 编制会被挪用,将前去一个以name 作为名字的属性的字符串。
 
举个例子。假设你有一个 Person 类,具有 first_name 属性。我们给操纵者访谒和 name 不异属性的内容的能力。下面是代码:
 
class Person(object):
    def __init__(self, first_name):
        self.first_name = first_name
 
    def __getattr__(self, name):
        if (name == &#39;name&#39;):
            return self.first_name
        raise AttributeError(&#39erson object has no attribute \&#39;{}\&#39;&#39;.format(name))
 
我们在终端运转代码:
 
person = Person(&#39;Jason&#39;)
>>> person.first_name
&#39;Jason&#39;
 
>>> person.name
&#39;Jason&#39;
 
>>> person.abc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __getattr__
AttributeError: Person object has no attribute &#39;abc&#39;
 
这意味着我们能凭空机关实例属性,是不是很棒?所以你能够偷偷的让你的 Dog 除了汪汪叫之外,还会喵喵叫:
 
class Dog(object):
    def bark(self):
        print(&#39;Ruff, ruff!&#39;)
 
    def __getattr__(self, name):
        if(name == &#39;meow&#39;):
           return lambda:  print(&#39;Meeeeeeow&#39;)
        raise AttributeError(&#39;I don\&#39;t know what you\&#39;re talking about...&#39;)
 
>>> snoop = Dog()
 
>>> snoop.bark()
Ruff, ruff!
 
>>> snoop.meow()
Meeeeeeow
 
你能够在没有 reflection 的环境下,随便添加新属性。object.__dict__ 是(字典)[https://docs.python.org/3.5/library/stdtypes.html#typesmapping] 包含 object 的属性和它们的值(寄望我说的是 object.dict, object 是一个实例,还有一个 class.dict,是类的属性的字典)。
 
意义是:
 
class Dog(object):
 
    def __init__(self):
        self.name = &#39;Doggy Dogg&#39;
 
等价于:
 
class Dog(object):
 
    def __init__(self):
        self.__dict__[&#39;name&#39;] = &#39;Doggy Dogg&#39;
 
两者输出是一样的:
 
snoop = Dog()
 
>>> snoop.name
&#39;Doggy Dogg&#39;
 
到这里你会想,是挺好的,但是有什么用呢?谜底很简单:magical APIs。你有没有用过一些 Python 库让你感受像魔法?这是让它们变的有”魔法”的一种环境。虽然一旦你懂了底层发生的工作,就会发觉没有魔法。
 
若是你还想体味更多,能够查看文档中的 Description Protocol。
 
Python 的面向对象
 
Python 的面向对象有点奇异。例如,类中没有私有变量和编制。所以你想在类中成立一个实例变量或私有编制,你必需恪守法例:
 
一个下划线 (_)暗示私有变量和编制。
两个下划线(__) 暗示的变量和编制,它们的名字会被编削。
 
举个例子,假设你有如下类:
 
class Foo(object):
    def __init__(self):
        self.public = &#39;public&#39;
        self._private = &#39;public&#39;
        self.__secret = &#39;secret&#39;
 
转到正文器:
 
>>> foo = Foo()
>>> foo.public
&#39;public&#39;
>>> foo._private
&#39;public&#39;
>>> foo.__secret
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: &#39;Foo&#39; object has no attribute &#39;__secret&#39;
 
如你所见,你能够访谒 _private 变量,但是最初一个例子发生了什么,它可否意味着有两个下划线的变量是真正的私有变量?谜底是 NO,它们的名字被改变了,现实上,它被 Python替代成了 _Foo_secret 。若是你想访谒的话,你仍然能够访谒:
 
>>> foo._Foo__secret
&#39;secret&#39;
 
然而,PEP8 建议只在父类中操纵双下划线来避免属性名冲突。“PEP”,暗示 “Python Enhancement Proposal”,它用来描述 Python 特征或感化。若是你想要添加一个新特征,你能够成立一个 PEP,多么能够让整个社区能够看到并会商。你能够在这里体味更多的 PEPs。
 
可见,Python 很相信法度员。
 
我不会再深切讲 OO 了,因为它需要零丁一篇文章(以致是一系列)来讲解。
 
我确实想给你提个醒,Python 的 OO 可不像 Java 言语那么天然,你需要慢慢适应,但你晓得吗,它只是干事的编制不合罢了。举个例子,它没有笼统类,你必需操纵点缀器来实现这个行为。
 
结语
 
但愿这篇文章,能够给你一个进修 Python 的出处。这篇文章来自一个为过去说了Python 的坏话而惭愧,此刻在四周宣传 Python 的人。我先申明一点,这只是小我爱好问题,当有人问我先学哪门言语时,我凡是保举 Python。
 
若是你还没决定,那就给它一次机缘!用上一两个小时,多读些关于它的东西。若是你爱好从书长进修,我也会帮你,看看《Fluent Python》, 下节还有更多。
 
册本保举
 
我兑现了诺言,这一节保举册本。我会尽量保持简短一些,只包含一些我读过的册本。
 
《Fluent Python》 —— 一本讲 Python3 的好书。无论你是新手、熟手还是高手都值得一读。包含了 Python 的来龙去脉。
《Web Scraping With Python》 —— 题目曾经说了然一切,讲若何用Python 来做收集爬虫。你会试探若何爬网上的内容,解析 HTML 等。我感受这本书对爬虫范畴的新手和熟手很有辅佐。即便你之前从没用过Python,你也能够看懂。它没有涉及任何高级主题。
《Black Hat Python》 —— 这个风趣!你能够成立反弹 SSH shell,木马等等!若是你想晓得 Python 若何做渗入测试,请必然要读它。寄望它操纵的是 Python 2,我有一个仓库,用的是 Python 3。
《Violent Python: A Cookbook for Hackers, Forensic Analysts, Penetration Testers and Security Engineers》 ——比上面的主题要多,你会学到若何写一个常见的用于实战的渗入测试,取证阐发和安然脚本。

获取更多免费本钱加qq群:869484885
兄弟连官网:www.lhx888.com
 

免费本钱

开班动静

当前校区

北京校区
  • 北京校区
  • 上海校区
  • 广州校区
  • 沈阳校区
  • 杭州校区
  • 南京校区
  • 郑州校区
  • 成都校区
  • 深圳校区
  • 西安校区
  • 姑苏校区
  • 深圳沙井
  • 深圳不雅澜
  • 深圳龙岗
  • 武汉校区
  • 西宁校区
  • 石家庄校区
  • 湖北咸宁
  • 广东惠州
  • 广东佛山
  • 北京 Python熬炼营 2019-04-24
  • 北京 Java熬炼营 2019-04-24
  • 北京 Java就业班 2019-05-09
  • 北京 Python就业班 2019-05-09
  • 北京 PHP就业班 2019-05-16
  • 北京 UI/UE就业班 2019-05-22
  • 北京 区块链就业班 2019-05-22
  • 上海 Java就业班 2019-05-09
  • 上海 Python就业班 2019-05-09
  • 上海 PHP就业班 2019-06-20
  • 上海 Java就业班 2019-07-17
  • 上海 Python就业班 2019-07-17
  • 上海 PHP就业班 2019-07-25
  • 上海 PHP就业班 2019-08-22
  • 广州 Python就业班 2019-05-09
  • 广州 Java就业班 2019-05-09
  • 广州 PHP就业班 2019-06-19
  • 广州 PHP就业班 2019-07-17
  • 广州 Python就业班 2019-07-17
  • 广州 Java就业班 2019-07-17
  • 广州 Python就业班 2019-08-13
  • 沈阳 Java就业班 2019-05-09
  • 沈阳 PHP就业班 2019-05-16
  • 沈阳 PHP就业班 2019-06-19
  • 沈阳 UI/UE就业班 2019-06-20
  • 沈阳 PHP就业班 2019-07-17
  • 沈阳 Java就业班 2019-07-17
  • 沈阳 Python就业班 2019-07-17
  • 杭州 PHP就业班 2019-05-16
  • 杭州 PHP就业班 2019-06-19
  • 杭州 Python就业班 2019-07-17
  • 南京 PHP就业班 2019-05-16
  • 南京 Java就业班 2019-06-11
  • 南京 PHP就业班 2019-07-17
  • 南京 Java就业班 2019-08-13
  • 郑州 PHP就业班 2019-05-16
  • 郑州 Python就业班 2019-06-11
  • 郑州 PHP就业班 2019-06-19
  • 郑州 PHP就业班 2019-07-17
  • 郑州 UI/UE就业班 2019-07-18
  • 郑州 Java就业班 2019-08-13
  • 郑州 Python就业班 2019-08-13
  • 成都 Python就业班 2019-06-11
  • 成都 Python就业班 2019-08-13
  • 成都 Python预科班 2019-09-24
  • 成都 Python就业班 2019-10-29
  • 成都 Python预科班 2019-12-18
  • 深圳 Java就业班 2019-05-09
  • 深圳 Java就业班 2019-06-11
  • 深圳 UI/UE就业班 2019-06-20
  • 深圳 Java就业班 2019-07-17
  • 深圳 PHP就业班 2019-07-17
  • 深圳 UI/UE就业班 2019-08-22
  • 深圳 Java就业班 2019-09-10
  • 西安 Java就业班 2019-05-09
  • 西安 Python预科班 2019-05-17
  • 西安 PHP预科班 2019-05-17
  • 西安 Java就业班 2019-06-11
  • 西安 Python就业班 2019-06-11
  • 西安 Python预科班 2019-06-20
  • 西安 PHP预科班 2019-06-20
  • 姑苏 UI/UE就业班 2019-05-22
  • 姑苏 PHP就业班 2019-06-19
  • 姑苏 UI/UE就业班 2019-07-18
  • 姑苏 PHP就业班 2019-08-21

                    Copyright © 2007-2019 IT兄弟连教育 版权所有 京ICP备11018177号  京公网安备 11010802026987号