标签:
---恢复内容开始---
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
编译:是将源程序翻译成可执行的目标代码,翻译与执行是分开;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在一用户程序
解释:具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型,对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点 ,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。
编译型:有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程成为编译,而负责编译的程序称为编译器。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件而不是前面说的可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都完成后,我们就可以最后把这些半成品的目标“打包”成一个可执行的文件了,这个工作由另一个程序负责完成,而负责连接的程序就叫链接程序。链接程序除了链接目标文件外,可能还有各种资源,像图标文件,声音文件,还要负责去除目标文件之间的冗余重复代码。链接完成后,一般就可以得到我们想要的可执行文件了
从字面上看,"编译"和"解释"的确都有"翻译"的意思,他们的区别则在于翻译的时机安排的不大一样。例如:你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也可以立刻让这名翻译辅助你阅读,让他一句一句的给你翻译,如果你想往回看某个章节,他也得重新翻译
两种方式,前者就相当于编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;后者相当于解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断的解释,执行,解释,执行。。。。。。所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了变异的步骤,修改调试也分厂方便,编辑完毕之后即可以立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的编译和链接过程。不过由于解释型程序是将编译的过程放到执行的过程中,这就决定了解释型程序注定要比编译型慢,几百倍的速度差距也是不足为奇的
编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如java语言虽然比较接近解释型语言的特征,但在执行前已经预编译,生成的代码是介于机器码和java源代码之间的中介代码,运行的时候则由JVM(java的虚拟平台)解释执行。它既保留了源代码的高抽象,可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比纯解释型程序要快很多,而像VB6,C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译后实际生成的也是一种中介代码,只不过编译器在前面按查了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所以以VB6编译生成的可执行程序都要用到它),以解释执行世纪的程序体。C#则是生成.net目标代码,实际执行时则由.net解释系统进行执行、当然.net目标代码已经相当"低级",比较接近机器语言了,所以将其视为编译语言,而且其可移植程度也没有java号称的这么强大,Java号称是“一次编译,到处执行"
而.net则是一次编码,到处编译。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变的模糊
当我们编写python代码时,我们得到的是一个包含python代码的以.py为扩展名的文本文件。要运行代码,就需要python解释器去执行.py文件
由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。
这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python
就是启动CPython解释器。
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>
作为提示符,而IPython用In [
序号
]:
作为提示符。
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
print is a function
the statement has been replaced with a print() function,with keyword arguments to replace most of the special syntax of the old statement
1 Old:print "The answer is",2*2 2 New:print("The answer is",2*2) 3 Old:print x,#Trailing comma suppresses newline 4 New:print(x,end=" ") #Appends a space instead of a newline 5 Old:print #Prints a newline 6 New:print() #You must call the function 7 Old:print >>sys.stderr,"fatal error" 8 New:print("fatal error",file=sys.stderr) 9 Old:(x,y) #print repr((x,y)) 10 New:((x,y)) #Not the same as print (x,y)!
You can also customize the separator between items,eg:
1 print("There are <",2**32,">possibilities!",sep="")
ALL IS UNICODE NOW
(A,*REST,B)=RANG(5)
1 >>> a,*rest,b = range(5) 2 >>> a,rest,b 3 (0, [1, 2, 3], 4)
某些库改名了
Old Name | New Name |
_winreg | winreg |
ConfigParser | configoarser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
markupbase | _markupbase |
repr | reprlib |
test.test_support | test.support |
在linux 下创建hello.py并输入
1 print("hello world")
然后执行命令:python hello.py 输出
1 localhost:~morgana$vim hello.py 2 localhost:~morgana$python hello.py 3 helloworld
上一步中执行python hello.py时,明确的指出hello.py脚本是由python解释器来执行
如果想要类似于执行shell脚本一样执行python脚本,例如:./hello.py,那么都需要在hello.py文件的头部指定解释器,如下
1 #!/usr/bin/env python 2 3 print("hello,world")
如此一来执行:./hello.py即可
ps:执行前需给予 hello.py 执行权限,chmod 755 hello.py
除了把程序写在文件里,还可以直接调用python自带的交互器运行代码
1 root@iZ25j36rr97Z:~# python 2 Python 2.7.12 (default, Jul 1 2016, 15:12:24) 3 [GCC 5.4.0 20160609] on linux2 4 Type "help", "copyright", "credits" or "license" for more information. 5 >>> print("Hello World!") 6 Hello World! 7 >>>
1 #_*_ coding:utf-8 _*_ 2 3 name = "morgana"
上述代码声明了一个变量,变量名为:name,变量name的值为"morgana"
变量名只能是字母,数字或下划线的任意组合
变量名的第一个字符不能是数字
以下关键字不能声明为变量名
1 ‘and‘,‘as‘,‘assert‘,‘break‘,‘class‘,‘continue‘, 2 ‘def‘,‘del‘,‘elif‘,‘else‘,‘except‘,‘exec‘,‘finally‘, 3 ‘for‘,‘form‘,‘global‘,‘if‘,‘import‘,‘in‘,‘is‘,‘lambda‘, 4 ‘not‘,‘or‘,‘pass‘,‘print‘,‘raise‘,‘return‘,‘try‘,‘while‘,‘with‘,‘yield‘
1 name= "morgnana" 2 3 name2= name 4 print(name,name2) 5 6 name = "jack" 7 8 print ("What is the value of name2 now?")
python解释器在加载.py文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code For Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用8位来表示(一个字节),即:2**8 = 256 -1 ,所以ASCII码最多只能表示255个符号
为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5
GB2313(1980年)一共收录了7445个字符,包括了6763个汉字和682个其他符号,汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768.其中有5个空位是D7FA-D7FE
GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。
从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。
有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。
显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多
UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...
所以,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:
报错:ascii码无法表示中文
1 #!/usr/bin/env python 2 3 print "你好,世界"
改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 print "你好,世界"
1 当行注释:#被注释内容 2 3 多行注释:"""被注释内容"""
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 6 #name = raw_input("What is your name?") #only on python 2.x 7 8 name = input("What is your name?") 9 10 print("Hello" + name)
输入密码时,如果想要不可见,需要利用getpass模块中的getpass,即
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 import getpass 5 6 #将用户输入的内容赋值给name变量 7 pwd = getpass.getpass("请输入密码:") 8 9 #打印输入的内容 10 print(pwd)
python 的强大之处在于他有非常丰富和强大的标准库的第三方库,几乎你想实现的任何功能都有相应的python库支持
1 #!/usr/bin/env python 2 #_*_ coding:utf-8_*_ 3 4 import sys 5 6 print(sys.argv) 7 8 输出 9 10 $ python test.py hello world 11 [‘test.py‘,‘hello‘,‘world‘] #把执行脚本时传递的参数获取到了
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 import os 5 6 os.system("df -h") #调用系统命令
完全结合一下
#!/usr/bin/env python #_*_coding:utf-8_*_ import os,sys os.system(‘‘,join(sys.argv[1:])) #把用户的输入的参数当作一条命令交给os.system来执行
python tab补全模块
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 5 import sys 6 import readline 7 import rlcompleter 8 9 if sys.platform == ‘darwin‘ and sys.version_info[0] == 2: 10 readline.parse_and_bind("bind ^I rl_complete") 11 else: 12 readline.parse_and_bind("tab:complete") 13 #linux and python3 on mac
#!/usr/bin/env python #_*_ coding:utf-8_*_ import sys import readline import rlcompleter import atexit import os #tab completion readline.parse_and_bind(‘tan:complete‘) #history file histfile = os.path.join(os.environ[‘HOME‘],‘.pythonhistory‘) try: readline.read_history_file(histfile) except IOError: pass atexit.register(readline.write_history_file,histfile) del os.histfile,readline,rlcompleter
简述Python的运行过程
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
1 2 是一个整数的例子 2 长整数 不过是大一些的整数 3 3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里52.3E-4表示52.3*10-4 4 (-5+4j)和(2.3-4.6j)是复数的例子,其中-5.4为实数,j为虚数,数学中表示负数的是什么呢
1 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647 2 在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,
即-9223372036854775808~9223372036854775807
long(长整型)
1 跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,
但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。 2 注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,
所以如今在长整数数据后面不加字母L也不会导致严重后果了
1 浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型, 2 占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。complex(复数) 4 复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。 5 注:Python中存在小数字池:-5 ~ 257
1 真或假 2 1或0
1 "hello world"
万恶的字符串拼接:
python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空间,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内存中重新开辟一块空间
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 name = "morgnana" 5 print "i am %s" % name 6 7 #输出 i am morgnana
PS :字符串是%s;整数%d;浮点数%f
创建列表:
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 name_list = [‘alex‘,‘seven‘,‘eric‘] 5 或 6 name_list = list([‘alex‘,‘seven‘,‘eric‘])
基本操作:
创建元祖:
1 #!/usr/bin/env python 2 # _*_coding:utf-8 _*_ 3 ages = (11,22,33,44,55) 4 或 5 ages = tuple((11,22,33,44,55))
创建字典:
1 #!/usr/bin/env python 2 # _*_coding:utf-8 _*_ 3 4 persion = {"name":"mr.gai","age":"18"} 5 或 6 persion = dict ({"name":"mr.gai","age":"18"})
常用操作:
身份运算
位运算:
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 a = 60 5 # 60 = 0011 1100 6 b = 13 7 # 13 = 0000 1101 8 9 c = a & b; 10 # 12 = 0000 1100 11 print "Line 1 - Value of c is",c 12 13 c = a|b; 14 # 61 = 0011 1101 15 print "Line 2 - Value of c is",c 16 17 c = a ^ b; 18 # 49 = 0011 0001 19 print "Line 3 - Value of c is",c 20 21 c = ~a; 22 # -61 = 1100 0011 23 print "Line 4 - Value of c is",c 24 25 c = a << 2; 26 # 240 = 1111 0000 27 print "Line 5 - Value of c is",c 28 29 c = a >> 2; 30 # 15 = 0000 1111 31 print "Line 6 - Value of c is",c
场景一,用户登录验证
1 #!/usr/bin/env python3 2 #_*_ coding:utf-8 _*_ 3 4 """ 5 提示输入用户名和密码 6 验证用户名和密码 7 如果错误,则输出用户名密码错误 8 如果成功,则输出欢迎,xxx! 9 """ 10 11 import getpass 12 13 name = input("请输入用户名:") 14 PassWd = getpass.getpass("请输入密码") 15 16 if name == "morgana" and PassWd == "123456": 17 print ("welcome %s" %name ) 18 else: 19 print ("用户名密码错误")
场景二 猜年龄游戏
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ """ 在程序里设定好你的年龄,然后启动程序让用户猜测, 用户输入后,根据他的输入提示输入的是否正确, 如果错误,提示是猜大了还是小了 """ Age = 31 Guess_Age= input ("请输入猜测年龄") if Guess_Age == Age: print("bingo") elif Guess_Age > Age: print("more small") elif Guess_Age < Age: print("more big") else: print("something wrong")
外层变量,可以被内层代码使用
内层变量,不应被外层代码使用
1 #!/usr/bin/env python3 2 #_*_ coding:utf-8 _*_ 3 4 __author__="morgnana" 5 6 for i in range(10): 7 print ("loop:",i)
需求一:还是上面的程序,但是遇到小于5的循环次数就不走了,直接跳入下一次循环
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 for i in range(10): 5 if i < 5: 6 continue 7 print(‘loop:‘,i)
需求二:还是上面的程序,但是遇到大于5的循环次数就不走了,直接退出
1 #!/usr/bin/env python3 2 #_*_ coding:utf8 _*_ 3 4 5 for i in range(10): 6 if i > 5: 7 break 8 print(‘loop:‘,i)
死循环
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ count = 0 while True: print ("welcome morgana",count) count+=1
上面代码100次后退出
1 #!/usr/bin/env python3 2 # _*_ coding:utf-8 _*_ 3 4 count = 0 5 6 while True: 7 print ("welcome morgana",count) 8 count+=1 9 if count == 100: 10 break
回到上面for 循环的例子,如何实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序
1 #!/usr/bin/env python3 2 # _*_ coding:utf-8 _*_ 3 4 Age=31 5 Count=0 6 7 while Count < 3: 8 Guess_Age=input(‘请输入年龄:‘) 9 if Guess_Age == Age: 10 print(‘bingo‘) 11 elif Guess_Age > Age: 12 print(‘more small‘) 13 elif Guess_Age < Age: 14 print(‘more big‘) 15 else: 16 print(‘someting wrong‘) 17 Count+=1 18 else: 19 print(‘wrong‘)
作业一:博客
作业二:编写登陆接口
标签:
原文地址:http://www.cnblogs.com/morgana/p/5939392.html