C语言初学python,感受和C的不比

 

自打开看Python到现在吧发生一半只多月份了,前后看了Python核心编程和Dive into
Python两本书。话说半个月看片以,是私有还掌握发生多全副吞枣,这为是以自身少尚未需求将这个开大型开发,主要是平时的小程序test用相同所以。所以
我的策略是,整体浏览,用到早晚现查。话说这基本编程第一版太古老了,老于言语2.2事先的东西,我看之翻电子版,翻译得啊不好,很别扭。看罢这个后还有
点云里雾里,看网上每户说DIP好,啄木鸟还发免费电子文档,就摸索来拘禁这。怎么说呢,讲的比核心编程好,但非符合第一软看的新家。我之所以当言得
好,是坐看核心编程,有些概念还闹几模糊,看了当时本开便知非掉了。要是初学者上来就扣留即仍,保证不好理解。

脚就当攻读的进程被,在翻阅资料之经过中,总结的有C和python比较明白的不同之处,有甚方向的,也闹细节之。肯定没有下结论了,比如动态
函数,lambda这些,我还无心向上写了。实际上,作为少数栽了两样之言语,下面这些出入只是冰山一角而已。权当抛砖引玉吧,至少应当本着与本人来平等研究
兴趣,正在考虑是否上外一样帮派语言的情人小帮助。此文吗算是DIP的上笔记吧。顺带说一样词,要是有意中人了解,可以帮忙引荐一下实战性强的Python教材,语言这东西,不多练手,光比划,是无容许学好的。

学习目的

自家之后的钻方向是嵌入式,显然,C语言是自身之关键语言。我未是一个语言爱好者,我先觉得,对于做研究而无是采取的食指的话,了解多山头语言,不如
精通一流派语言。之所以去押python,主要还是因python更便民快速支付片先后,也是以今天认识及,研究及行使是未能够分开之。个人觉得,要
想以微机工程的竞争着立足,必须懂C语言。因为确实要举行强性能编程,
不可能用机械的系架构抛到脑子后让Python虚拟机(或Java虚拟机等)帮您搞定所有根。越来越多的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]*3
for 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 = 1

def func():
print globalvar
# This makes someglobal readonly,
# any attempt to write to someglobal
# would create a new local variable.

def func2():
global globalvar
globalvar = 2
# this allows you to manipulate the global
# variable

在 func这个函数中,globalvar是独自读之。如果您以了globalvar =
xxx这种赋值语句,Python会重新创设一个新的地头对象并将新值赋给其,原来的对象值未变换。而以func2套数惨遭,由于我们事先申明了
globalvar是global的,那么此时之变动就一直当全局变量上生效。