学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1168

主题
发表于 2019-1-31 23:21:49 | 查看: 7229| 回复: 0
Python是蟒蛇的意思
Python编写的程序可以跨平台运行
494555c53122d4e231.png
英文原文:Why everyprogrammer should learn Python or Ruby

每个程序员都应该学习使用PythonRuby  如果你是个学生,你应该会CC++Java。还会一些VB,或C#/.NET。多少你还可能开发过一些Web网页,你知道一些HTMLCSSJavaScript知识。总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能。这真让人遗憾,因为还有很多种编程语言,它们能让你成为一个更好的程序员。  

在这篇文章里,我将会告诉你,为什么你一定要学习PythonRuby语言。  C/C++/Java相比 Python/Ruby能让你用少的多的多的代码写出相同的程序。

有人计算过,PythonRuby写出的程序的代码行数只相当于相对应的Java代码的行数的五分之一。如果没有绝对的必要,为什么要花这么多时间写出这么多的代码呢?而且,有人说,一个优秀的程序员能维护的代码量最多是2万行。这不区分用的语言究竟是汇编,C还是Python/Ruby/PHP/Lisp。所以,如果你用Python/Ruby写,你一个人干的,不管是干什么,如果换用Java/C/C++,那都需要一个5人的小团队来干。  

VB/PHP比较 PHP/VB相比,Python/Ruby的是一种从设计上讲比它们好的不知多少倍的语言。PHPVB分别是在开发网站和桌面应用程序上非常流行的语言。它们流行的原因是非常的易学。不懂计算机的人也很容易的上手。如果你用这些语言开发过大型的项目,你就会发现这些语言的设计是如此的糟糕。是朋友,他就不会劝你使用PHP/VB  Lisp/Scala/Haskell/Closure/Erlang相比 Python/Ruby跟它们比起来显得相当的“主流”。确实,这些语言每种都有其很酷的特征,对于高级编程人员,了解这些语言能给他们对编程的思考带来实际的提升。但这些应该在你以后的职业生涯中才去决定学哪一两种。对于现在,Python/Ruby是在语言功能和实际运用之间平衡后的更好的选择。

Perl相比 PythonRuby都受恩于Perl,在这两种语言异军突起前,Perl是最好、最大的一种动态语言。但现在,Perl已是明日黄花,越来越多的人转向Ruby/Python。我感觉Perl的面向对象机制有点做作,很不好用。通常认为,Perl一种比较难学的语言,因为它提供你了太多不同的方法去完成同一个任务,它的语法有点像密码,非常不直观 除非你对它掌握的非常好。总之,我感觉Perl是一种对于学生来说不是很合适的语言—除非你有特殊的理由去学它(例如,你有很多正则表达式要处理,这是Perl的闪光点)  sh/sed/awk/bash相比 如果你使用Linux/Unix,你可能需要做一些shell编程,甚至会编写一些不小的程序。但是,对于这些语言,一旦程序达到一定的行数,事情就会开始变得让你痛苦不堪,你最好是用Python去做这些事情。当然,做这种事情,Perl是最好的选择,Python排第二。(Ruby对于系统shell脚本不是很合适)  

你可以在Google上搜一下“为什么XY好” 其中把X换成PythonRuby,把Y换成另外一种语言 你就会发现,有无数的文章来说明它们为什么这么好。  如果你有选择你的毕业设计使用的编程语言的自由,你应该选择PythonRuby,它们能让你在开发项目的过程中节省一半的时间(除非你要开发的是移动应用,这样你必须要使用JavaObjective-C)


Youtobe,豆瓣都是用python开发出来的,Linuxmac系统都自带python的解释环境,python也可以制作3D特效,云计算首选python语言
934145c531244474f8.png
Python3不兼容以前的版本,python是面向对象的程序设计

下面是Python3.0的改动
本段简单的列出容易使人出错的变动(初学者应该注意)。

print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法。例如:

Old: print "The answer is", 2*2
New: print("The answer is", 2*2)

Old: print x,                                   # 使用逗号结尾禁止换行
New: print(x, end=" ")                  # 使用空格代替换行

Old: print                                       # 输出新行
New: print()                                   # 输出新行

Old: print >>sys.stderr, "fatalerror"
New: print("fatal error",file=sys.stderr)

Old: print (x, y)                               # 输出repr((x, y))
New: print((x, y))                            # 不同于print(x, y)!

你可以自定义输出项之间的分隔符:
   print("There are <", 2**32, ">possibilities!", sep="")
输出结果是:
   There are <4294967296> possibilities!

注意:

print()函数不支持老print语句的"软空格"特性,例如,在python2.x中,print "A\n", "B"会输出"A\nB\n",而python3.0中,print("A\n", "B")会输出"A\n B\n"

使用 2to3 源码转换工具时,所有的print语句被自动转换成print()函数调用,对大项目,这是无需争论的。

python3.0使用字符串(strings)bytes代替Unicode字符串和8位字符串,这意味着几乎所有使用Unicode编码和二进制数据的代码都要改动。这个改动很不错,在2.x的世界里,无数的bug都是因为编码问题。

map()filter()返回迭代器(iterators)

dict方法keys(),items(),values()返回视图(同样是迭代器)而不是列表(list)

内建的sorted()方法和list.sort()方法不再接受表示比较函数的cmp参数,使用key参数代替。

1/2返回浮点数,使用1//2能得到整数。

repr()函数对于long整数不再包含拖尾的L,所以不加判断的去除最后一个字符会导致去掉一个有用的数字。

String and Bytes

现在只有一种字符串:str,它的行为和实现都很像2.xunicode串。

basestring超类已经去掉了,2to3 工具会把每个出现的basestring替换成str

PEP3137:新类型bytes,用来表示二进制数据和编码文本,strbytes不能混合,需要时,必须进行显示的转换,转换方法是str.encode()(str->bytes)bytes.decode()(bytes->str).

在原始字符串(raw strings)中所有反斜线都按字面量解释,不再特殊处理Unicode转义字符。

PEP3112:bytes字面量,例如b"abc",创建bytes实例。

PEP3120:默认源文件编码为UTF-8

PEP3131:可以使用非ASCII标识符(然而,除了注释中贡献者的名字之外,标准库仍然只包含ASCII)

PEP3116:新的IO实现,API几乎100%向后兼容,二进制文件使用bytes代替strings

去除了StringIOcStringIO模块,取而代之的是io.StringIO或者io.BytesIO

PEP3101:字符串格式化的新方法

str.format方法(原文提到替代了%操作符,实际上,format方法和%的用法差别很大,各有所长)

PEP3106:修补了dictkeys(),items(),values()方法

删除了dict.iterkeys(),dict.itervalues()dict.iteritems()

dict.keys(),dict.values()dict.items()返回dict相关数据的引用


PEP3107:函数注解(Function Annotations)

注解函数参数和返回值的标准化方法

Exception Stuff

PEP352:异常类必须继承自BaseException,它异常结构的基类。

移除了StandardError

Dropping sequence behavior (slicing!) andmessage attribute of exception instances.

PEP3109:抛出异常:现在必须使用raise Exception(args)而不是原来的raiseException, args

PEP3110:捕获异常,现在必须使用except Exception as identifier而不是原来的except Exception, identifier

PEP3134:异常链(Exception chain)

改良了一些windows不能加载模式时的异常信息,具有本地化处理。

New Class and Metaclass Stuff

移除了classic class

PEP3115:新的metaclass语法

PEP3119:抽象基类。

PEP3129:类包装。

PEP3141:数字抽象基类

其他的语言变化

这里列出大多数的python语言核心和内建函数的变化。

移除了backticks(使用repr()代替)

移除了<>(不等号,使用!=代替)

aswith变成了关键字

True,FalseNone变成了关键字

PEP237:long不存在了,只有int,它和原来的long一样。不再支持以L结尾的数字字面量。移除sys.maxint,因为int现在已经是无限大了

PEP238:int相除,返回float

改变了顺序操作符的行为,例如x<y,当xy类型不匹配时抛出TypeError而不是返回随即的bool

移除了__getslice__,语法a[i:j]被解释成a.__getitem__(slice(i,j))

PEP3102:keyword-only arguments.在函数参数列表中,出现在*args之后的命名参数只能使用"关键字参数"的形式调用

PEP3104:nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)

PEP3111:raw_input() 改名为input(),也就是说,新的input()函数从标准输入设备(sys.stdin)读取一行并返回(不包括行结束符),如果输入过早终止,该函数抛出EOFError,如果想使用老的input(),可以使用(input())代替。

xrange()改名为range()range()现在不是产生一个列表(list),而是一个迭代器。

PEP3113:移除了"元组参数拆包(tuple parameterunpacking)"。这种写法已经不行了:

def foo(a, (b, c)):

现在要这样写:

def foo(a, b_c):
     b,c = b_c
复制代码

PEP3114:next()重命名为__next__(),新的内建函数next()可以调用一个对象的__next__()方法。

PEP3127:新的八进制字面量,二进制字面量和bin()函数。你应该写0o666而不是0666oct()函数也做了响应的改动。同样,0b1010等价于10bin(10)返回"0b1010″。0666这种写法现在是错误的。

PEP3132:支持迭代器拆包。现在你可以这样写:

a, b, *rest = some_seqence

甚至象这样:

*rest, a = stuff
一般情况下,rest对象是list,而等号右边的对象是可迭代的
复制代码

PEP3135:新的super()。你可以不适用任何参数调用super(),正确的参数和实例会被正确选择。如果使用参数,它的行为不变,和以前一样。

zip(),map(),filter()返回迭代器。

移除了string.letters和它的小伙伴们(string.lowcasestring.uppercase),现在上场的是string.ascii_letters

移除了apply(),callable(),exefile(),file(),reduce(),reload()

移除了dict.has_key()。使用in操作符进行测试

exec语句没有了,现在是exec()函数

移除了__oct__()__hex__()特殊方法。oct()hex()方法使用__index__()

移除了对__members____methods__的支持

nb_nonzero重命名为nb_bool,__nonzero__()重命名为__bool__()

Optimizations

一般情况下,python 3.0python 2.533%左右。不过仍有提升空间。

模块变动(新的,改进的和废弃的)

移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。

移除了imageop模块

移除了audiodev, Bastion,bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec,sets, sha, stringold, strop, sunaudiodev, timingxmllib模块

移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取)

移除了new模块
os.tmpnam()os.tmpfile()函数被移动到tmpfile模块下

tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是tokenize.tokenize()

Build and C API Changes

Python's build processC API的改动包括:

PEP3118:新的Buffer API

PEP3121:扩展模块的的Initialization & Finalization

PEP3123:使PyObject_HEAD符合标准C

其他的改动和修复

在源码里分散一系列的改进和bug修复。changes log表明,从2.63.0,有XXX个改动和YYYbug修复。
776285c531263e3ea8.png

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-11-25 13:08 , Processed in 0.132233 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表