
初学python,感受和C的不同
从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive into Python两本书。
话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。
所以我的策略是,整体浏览,用到时候现查。
话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。
看完这个后还有 点云里雾里,看网上人家说DIP好,啄木鸟还有免费,就找来看这个。
怎么说呢,讲的比核心编程好,但不适合第一次看的初学者。
我之所以觉得讲得 好,是因为看核心编程,有些概念还有些模糊,看了这本书就明白不少了。
要是初学者上来就看这本,保证不好理解。
下面就是在学习的过程中,在翻阅资料的过程中,总结的一些C和python比较明显的不同之处,有大方向的,也有细节的。
肯定没有总结完,比如动态函数,lambda这些,我都懒得往上写了。
实际上,作为两种完全不同的语言,下面这些差异只是冰山一角而已。
权当抛砖引玉吧,至少应该对和我有相同研究兴趣,正在考虑是否学习另一门语言的朋友有点帮助。
此文也算是DIP的学习笔记吧。
顺带说一句,要是有朋友了解,可以帮忙推荐一下实战性强的Python教材,语言这东西,不多练手,光比划,是不可能学好的。
学习目的我的以后的研究方向是,显然,C语言是我的主要语言。
我不是一个语言爱好者,我以前觉得,对于做研究而不是应用的人来说,了解多门语言,不如精通一门语言。
之所以去看python,主要还是因为python更有利于快速开发一些程序,也是因为现在认识到,研究和应用是不能分离的。
个人以为,要 想在的竞争中立足,必须懂C语言。
因为真正要做高性能编程, 不可能将机器的体系架构抛到脑后让Python虚拟机(或等)帮你搞定所有底层。
越来越多的CPU core,越来越恐怖的内存性能瓶颈,对于上层开发人员来说,无所谓,但是对高性能程序开发人员来说,这些是无法透明的。
很多应用,还是自己掌控比较有 效。
这些场合中,汇编和C还是不可替代的。
但是,光知道C是不够的,掌握一门,相对更高层的语言,不仅对以后的个人发展有利,也会对自己的技 术认识产生帮助。
如果要问对我来说谁更重要,我觉得还是C更重要。
C的学习曲线更陡,貌似简单,实际上到处都是陷阱,看上去比较简单低效的程序,也不是学1,2个月就能搞定的。
谈到优化的深层次和难度嘛,需要的功底是按年算的。
但是一旦你C语言的基础打好了,对计算机的理解,对其他语言的理解都是大有裨益的。
比如,如果你有C基础,可以说,学过1天python,就能写的出来一些不短的程序。
后面的优化也不是什么大不了的算法,都是非常基本的语句换来换去。
当然这里 不是说 Python不好,实际上,上层应用,Python比C方便的不是一个层次。
很多人觉得,既然懂C了,那么进一步掌握C++应该是水到渠成,但C++不是C的超集,而我又不喜欢C++的繁琐和巨大,所以才决定看一看Python。
我很喜欢Python的优雅与快捷。
语言类型和C不一样,Python是一种动态类型语言,又是。
这个分类怎么理解呢
大概是可以按照下列说明来分类的:静态类型语言一种在编译期间就确定数据类型的语言。
大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。
Java和 C 是静态类型语言。
动态类型语言一种在运行期间才去确定数据类型的语言,与静态类型相反。
Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。
一种总是强制类型定义的语言。
Java 和 Python 是强制类型定义的。
您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。
一种类型可以被忽略的语言,与强类型相反。
VBScript 是弱类型的。
在 VBScript 中,您可以将字符串 ‘12′ 和整数 3 进行连接得到字符串’123′,然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。
对象机制具体怎么来理解这个“动态确定变量类型”,就要从Python的Object对象机制说起了。
Objects(以下称对象)是Python对于数据的抽象,Python中所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念。
每一个对象都有三种属性:实体,类型和值。
理解实体是理解对象中很重要的一步,实体一旦被创建,那么就一直不会改变,也不会被显式摧毁,同时通常意义来讲,决定对象所支持的操作方式的类型(type,包括number,string,tuple及其他)也不会改变,改变的只可能是它的值。
如果要找一个具体点的说明,实体就相当于对象在内存中的地址,是本质存在。
而类型和值都只是实体的外在呈现。
然后Python提供一些接口让使用者和对象交互,比如id()函数用来获得对象实体的 整形表示(实际在这里就是地址),type()函数获取其类型。
这个object机制,就是c所不具备的,主要体现在下面几点:1 刚才说了,c是一个静态类型语言,我们可以定义int a, char b等等,但必须是在源代码里面事先规定。
比如我们可以在Python里面任意一处直接规定a = “lk”,这样,a的类型就是string,这是在其赋值的时候才决定的,我们无须在代码中明确写出。
而在C里面,我们必须显式规定char *a = “lk”,也就是人工事先规定好a的类型2 由于在C中,没有对象这个概念,只有“数据的表示”,比如说,如果有两个int变量a和b,我们想比较大小,可以用a == b来判断,但是如果是两个字符串变量a和b,我们就不得不用strcmp来比较了,因为此时,a和b本质上是指向字符串的指针,如果直接还是用==比较, 那比较的实际是指针中存储的值——地址。
在Java中呢,我们通过使用 str1 == str2 可以确定两个字符串变量是否指向同一块位置,这叫做“对象同一性”。
在 Java 中要比较两个字符串值,你要使用 str1.equals(str2)。
然后在Python中,和前两者都不一样,由于对象的引入,我们可以用“is”这个运算符来比较两个对象的实体,和具体对象的type就没有关系 了,比如你的对象是tuple也好,string也好,甚至class也好,都可以用”is”来比较,本质上就是“对象同一性”的比较,和Java中 的==类似,和 C中的pointer比较类似。
Python中也有==比较,这个就是值比较了。
3 由于对象机制的引入,让Python的使用非常灵活,比如我们可以用自省方法来查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行 操作。
用这种方法,你可以定义没有名称的函数,不按的参数顺序调用函数,甚至引用事先并不知道名称的函数。
这些操作在C中都是不可想象的。
4 还有一个很的细节,就是类型对对象行为的影响是各方面的,比如说,a = 1; b = 1这个语句中,在Python里面引发的,可能是a,b同时指向一个值为1的对象,也可能是分别指向两个值为1的对象。
而例如这个语句,c = []; d = [],那么c和d是肯定指向不同的,新创建的空list的。
没完,如果是”c = d = []“这个语句呢
此时,c和d又指向了相同的list对象了。
这些区别,都是在c中没有的。
最后,我们来说说为什么python慢。
主要原因就是function call overhead比较大。
因为所有东西现在都是对象了,contruct 和destroy 花费也大。
连1 + 1 都是 function call,像’12′+’45′ 这样的要 create a third string object, then calls the string obj’s __add。
可想而知,速度如何能快起来
列表和数组分析Python中的list和C中的数组总是很有趣的。
相信可能一些朋友和一样,初学列表的时候,都是把它当作是数组来学的。
最初对于list和数组区别的定性,主要是集中在两点。
首先,list可以包含很多不同的数据类型,比如[this, 1, is, an, array]这个List,如果放在C中,其实是一个字符串数组,相当于二维的了。
其次呢,list有很多方法,其本身就是一个对象,这个和C的单纯数组是不同的。
对于List的操作很多样,因为有方法也有重载的运算符。
也带来一些问题,比如下面这个例子:加入我们要产生一个多维列表,用下面这个语句A = [[None] * 2] * 3结果,A的值会是[[None, None], [None, None], [None, None]]初一看没问题,典型的二维数组形式的列表。
好,现在我们想修改第一个None的值,用语句A[0][0] = 5现在我们再来看看A的值:[[5, None], [5, None], [5, None]]发现问题没有
这是因为用 * 来复制时,只是创建了对这个对象的引用,而不是真正的创建了它。
*3 创建了一个包含三个引用的列表,这三个引用都指向同一个长度为2的列表。
其中一个行的改变会显示在所有行中,这当然不是你想要的。
解决方法当然有,我们这样来创建A = [None]*3for i in range(3):A[i] = [None] * 2这样创建了一个包含三个不同的长度为2的列表。
所以,还是一直强调的,越复杂的东西,越灵活,也越容易出错。
代码优化C是一个很简单的语言,当我们考虑优化的时候,通常想得也很简单,比如系统级调用越少越好(缓冲区机制),消除循环的低效率和不必要的系统引用,等 等,其实主要都是基于系统和硬件细节考虑的。
而Python就完全不一样了,当然上面说的这些优化形式,对于Python仍然是实用的,但由于 Python的语法形式千差万别,库和模块多种多样,所以对于语言本身而言,就有很多值得注意的优化要点,举几个例子吧。
比如我们有一个list L1,想要构建一个新的list L2,L2包括L1的头4个元素。
按照最直接的想法,代码应该是L2 = []for i in range[3]:L2.append(L1[i])而更加优化和优美的版本是L2 = L1[:3]再比如,如果s1..s7是大字符串(10K+),那么join([s1,s2,s3,s4,s5,s6,s7])就会比 s1+s2+s3+s4+s5+s6+s7快得多,因为后者会计算很多次子表达式,而join()则在一次过程中完成所有的复制。
还有,对于字符串操作, 对字符串对象使用replace()方法。
仅当在没有固定字符串模式时才使用正则表达式。
所以说,以优化为评判标准,如果说C是短小精悍,Python就是博大精深。
include和import在C语言中的include非常简单,因为形式单一,意义明确,当你需要用到外部函数等资源时,就用include。
而Python中有一个相似的 机制,就是import。
乍一看,这两个家伙挺像的,不都是我们要用外部资源(最常见的就是函数或者模块(Python))时就用这个来指明么
其实不然,两者的处理机制本质区别在于,C中的include是用于告诉预处理器,这个include指定的文件的内容,你都给我当作在本地源文件中出现过。
而import呢,不是简单的将后面的内容*直接*插入到本地里面去,这玩意更加灵活。
事实上,几乎所有类似的机制,Python都比C灵活。
这里不是说C 不好,C很简练,我其实更喜欢C。
简单说说这个灵活性。
import在python中有三种形式,import X, from X import *( or a,b,c……), X = __import__(’x')。
最常用的是第二种,因为比较方便,不像第一种那样老是用X.module来调用模块。
from X import *只是import那些public的module(一般都是不以__命名的模块),也可以指定a,b,c来import。
什么时候用哪一种形式呢
应该说,在大多数的模块文档里,都会明确告诉你应该用哪种形式。
如果需要用到很多对象,那么from X import *可能更合适一些,但是,就目前来看,大多数第三方Python库都不推荐使用from modulename import * 这种格式。
这样做会使引入者的namespace混乱。
很多人甚至对于那些专门设计用于这种模式的模块(包括Tkinter, threading和matplot)都不采用这种方式。
而如果你仅仅需要某个对象类a,那么用from X import a比用import X.a更好,因为以后你调用a的函数直接用a.function()既可以了,不用加X。
如果你连自己希望import的模块都不知道怎么办
请注意,此时Python的优势就体现出来了,我们可以用 __import__(module)来调用module,其中这个module是字符串,这样,可以在运行时再决定,你到底要调用什么module。
举 个例子:def classFromModule (module, Name):mod = __import__ (module)return getattr (mod, Name)这里,定义了一个函数classFromModule,你可以在代码的任何时候调用它,o = classFromModule (ModuleOfTheClass, NameOfTheAttribute)()只需要传入字符串形式的你希望import的模块ModuleOfTheClass和其中属性的名字NameOfTheAttribute(当然可以是数据也可以是方法),就能调用了,这个名字字符串不用事先指定,而是根据当时运行的情况来判断。
顺带说一句,Python中import的顺序也有默认规定,这个和C中的include有点类似,因为我们一般都是先include系统文件,再 include自己的头文件(而且还有<>和“”的区别)。
Python中呢,一般应该按照以下顺序import模块:1. 标准库模块 — 如 sys, os, getopt 等2. 第三方模块3. 本地实现的模块。
全局变量这里谈全局变量呢,倒不是说Python和c的全局变量概念不同,他们的概念是相同的。
只是在使用机制上,是有一些差异的。
举个例子:– module.py –globalvar = 1def func():print globalvar# This makes someglobal readonly,# any attempt to write to someglobal# would create a new local variable.def func2():global globalvarglobalvar = 2# this allows you to manipulate the global# variable在 func这个函数中,globalvar是只读的。
如果你使用了globalvar = xxx这种赋值语句,Python会重新创造一个新的本地对象并将新值赋给它,原来的对象值不变。
而在func2函数中,由于我们事先申明了 globalvar是global的,那么此时的更改就直接在全局变量上生效。
如何学习Python总结之谈
在研究生阶段,我学一段时间的 Python。
最主要的目的,还是希望能够在论文当画出一些曲线数,以及做一些机器学习算法相关的实验,不过当时我是有 Java 语言基础的。
所以对于初学者来说,学习 Python 语言分为两种情况:一种是没有其他编程语言基础的同学,另外一种就是有其他语言基础的同学,后者学习 Python 会更为简单一些。
对于没有其他编程语言基础的同学,首先,在你学习 Python 语言之前,一定要清楚自己为什么要学习 Python,一定要带着目标来进行学习。
刚开始学习 Python 的时候,你可以去网上搜集一些 Python 入门的博客,或者买一些 Python 语言入门的书籍来进行学习,当然光看书或者博客还是不够的,你可以安装一个 Python 写代码的I DEA,比如 PyCharm。
边看书,边跟着书上的代码实例,进行代码编写,这样才能够加深你对于 Python 的映象。
在学习 Python 有一段时间之后,你应该会基本了解了 Python 语言的相关基础语法。
然后你就可以去安装一些 Python 语言的开源扩展包,来实现你当初学习 Python 的目标,比如机器学习算法实验、大数据分析、Excel 表格分析等等。
对于有其他编程语言基础的同学,那其实学习 Python 对于你而言,就会容易很多。
你可以直接上手写 Python 代码,然后不会的基础语法,就从网上查找即可。
打个比方,假如你不会使用 Python 的集合类操作,你可以边谷歌,按照网上的代码示例写即可。
当你想实现某个功能,你可以先查找是否有 Python 的扩展包支持该功能。
如果有的话,直接安装使用即可。
你学习 Python 的目标就是为了解决某个问题。
不用太在意是否掌握 Python 这门语言,毕竟编程语言的思想都是相通的。
结语我是Lake,专注大数据技术原理、人工智能、数据库技术、程序员经验、编程语言分享,如果我的问答对你有帮助的话,希望你能点赞关注我,感谢。
我会持续分享在科技方面的内容,如果你有任何问题,也欢迎关注私信我,我会认真解答每一个问题,期待您的关注。
python初学者求帮助
晕死,这位大侠大侠你把我打败了。
我告诉你怎么用IDLE吧:1、点开IDLE,在“python shell”窗口的左上角点“File”中点开一个“New Window”,2、再在新打开的“New Window”窗口的编辑区内编写代码。
3、编写完后再在新打开的“New Window”窗口左上角点击“save”,再保存到你要保存的位置(例:保存在c盘下)。
文件名由你自己定(例:helloworld.py),这样文件就路径就是c:\\\\helloworld.py 。
这时你可以按”F5“键运行4、再在windows 的开始中运行cmd,再在cmd窗口中输入pyhon c:\\\\helloworld.py (也可以先输入cd ..\\\/.. 回车后再输入pyhon helloworld.py)。
5、要修改时点开IDLE,在“python shell”窗口的左上角点“File”中点开一个“open ..“,找到c:\\\\helloworld.py 打开编辑窗口(以窗口名称helloworld.py c:\\\\ helloworld.py),修改里面的类容就OK。
这样你的第一、二、三问题就不会出现。
第四个问题就是在第2或者第5步打开的编辑窗口后。
关闭“python shell”窗口,再点击你的编辑窗口“Run”中的“python shell”,就出现一个干净的python shell界面。
第五个问题,你找一个有道词典,一个个翻译吧。
python的开发环境很多,我用的有eclipse、wing ide、还有别人推荐的pycharm,都非常不错。
你可以试试
我说的够系统吧,快把分给我吧
:)
对于初学者应该选择python什么版本呢
你巧了,呵呵。
结论是:建议用2.7系列的;具体原因:之前刚写了总结的帖子,详细解释了,你一看就知道了:【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间的区别另外,关于如何学习python,感兴趣,也可以去看看:【整理】如何学习Python + 如何有效利用Python有关的网络资源 + 如何利用Python自带手册(Python Manual)(此处不给贴地址,所以请自己google标题,即可找到帖子地址)



