1、Python简介
1.1 Python是什么
Python是近年来编程界最火的热点,没有之一。从性质讲它与我们熟悉的C/C++、Java、PHP等没有什么本质的区别,也是一种开发语言,而且已经进入主流的二十种开发语言中的Top5。
1.2 Python的由来和发展趋势
1989年,吉多·范罗苏姆(Guido van Rossum)在阿姆斯特丹为了打发无聊的圣诞节,决心开发一个新的脚本解释程序,他希望这个新的叫做Python的余元能够符合他的理想:创造一种C和shell之间功能全面、易学易用、可以扩展的语言。
1991年,第一个Python编译器诞生,基于C语言实现,并能够调用C语言的库文件。后面经历版本的不断革新换代,2004年的2.4版本诞生了目前最流行的WEB框架Django,六年后Python发展到2.7版本,这是目前为止2.x版本中最新且较为广泛使用的版本。
2.7版本的诞生不同于以往2.x版本的垂直换代逻辑,它是2.x版本和3.x版本之间过渡的一个桥梁,以便最大程度上继承3.x版本的新特性,同时尽量保持对2.x版本的兼容性。
此3.x在2.7版本之前就已问世,从2008年的3.0版本开始,Pythone3.x系呈迅猛发展之势,版本更新活跃,一直发展到现在最新的3.7版本。
Python2 VS Python3
许多初学者会纠结于从2.x版本还是从3.x版本开始Python的学习。这里简要对比下两者的差异:
1、3.x库中print是函数,使用起来更加方便(PRINT IS FUNCTION)
2、3.x版本默认使用UNICODE编码,解决了从前常见的中文乱码问题
3、3.x版本中某些库被改了名,具体的在后续学习中深入展开
4、目前3.x版本还不能完全支持Twisted module(网络框架),这恐怕是3.x版本中最大的遗憾。
官方宣布2020年之后不再支持2.x系列中使用最多的2.7版本,所以初学者建议从3.x开始学习。
1.4 Python的优缺点
优点
1、优雅、明确、简单:这是Python的定位,使得Python程序看上去简单易懂,初学者容易入门,学习成本更低。但随着学习的不断深入,Python一样可以胜任复杂场景的开发需求。引用一个说法:Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量少些代码。
2、开发效率高:Python作为一门高级语言,具有丰富的第三方库,官方库中也有相应的功能模块支持,覆盖了网络、文件、GUI、数据库、文本等大量内容。因此开发者无需事必躬亲,遇到主流的功能需求时可以直接调用,在基础库的基础上施展拳脚,可以节省很多功夫和时间成本,大大降低开发周期。
3、无需关注细节:Python作为一种高级语言,在编程时无需关注底层细节(如内存管理等)
4、功能强大:Python是一种前端后端通吃的综合性语言,功能强大,PHP能胜任的角色它都能做。至于后端如何胜任,需要在后续的学习中逐步领悟。
5、可移植性:Python可以在多种主流的平台上运行,开发程序时只要绕开对系统瓶体的依赖性,就可以在无需修改的前提下运行在多种系统平台上。其他优点有待继续发掘。
缺点:
1、代码运行速度慢:因为Python是一种高级语言,不像C语言一样可以深入底层硬件最大程度上榨取硬件的性能,因此它的运行速度要远远慢于C语言。另外一个原因是,Python是解释型语言,我们的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程比较耗时,所以很慢。而C程序时运行前直接编译成CPU能够执行的机器码,所以非常快。
需要注意的是,这种慢对于不需要追求硬件高性能的应用场合来说,根本不是问题。因为他们比较的数量级并不是用户能够直观感受到的(比如开发一个网络下载器,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络的延时更慢,需要等待1秒,用户的体验几乎没有差别,除非使用精确的计时器来计时)。
2、发布程序时必须公开源码:还是因为Python是一门解释型语言,没有编译打包的过程(据说最新的Python可以打包,但本质上还是把源代码和解释器打在一起,没有太大的实际意义)。这个缺点仅限于我们想单纯靠卖开发出来的软件产品挣钱的时候。但在当前这个互联网时代,不靠卖产品本身来赚钱的商业模式越来越主流了,所以这已经不是什么大问题了。
1.5 Python的适用领域
1、云计算开发:云计算领域最火的语言,典型代表OpenStack
2、WEB开发:众多优秀的WEB框架、众多优秀的WEB站点(YouTube、Instagram、豆瓣等)均基于Python开发
3、系统运维:各种自动化工具的开发,CMDB、监控告警系统、堡垒机、配置管理&批量分发工具等均可以搞定
4、科学计算、人工智能:围棋大战的谷歌阿尔法狗部分功能使用了Python
5、图形GUI:暂缺大型应用
6、网络爬虫:这年头网络爬虫无处不在,很多都是基于Python开发,包括谷歌的爬虫,估计这是爬虫工程师的必备工具吧。
1.6 哪些地方在使用Python
来自几个现货的知名公司应用案例:
谷歌:Google app engine、google earth、爬虫、广告等
YouTube:世界最大的在线视频网站基于Python开发
Instagram:美国最大的图片分享网站,全部基于Python开发
Facebook:大量的基础库基于Python开发
Redhat:yum包管理工具基于Python开发
国内知名互联网公司的应用:豆瓣、知乎网站、主流互联网公司如阿里、腾讯、百度、金山、搜狐、盛大、网易。。。等通过Python来完成各种任务
2、Python基础
2.1 编程开发规范
1、代码开头:Python中代码必须顶格书写,除非被作为语句嵌套在条件判断或循环结构中
2、代码层级:代码与代码之间的逻辑层级关系通过空格来界定,第一层顶格书写,第二层开头预留4个空格(如果不考虑跨平台可使用tab)
3、对齐方式:同一个层级的代码必须严格对齐,如第一层都是顶格,第二层都是4个空格开头,第三层则是8个空格,以此类推。
4、注释:单行注释用#开头,单独一行作为注释或在代码后面通过#跟上注释均可,多行注释在首尾处用成对的三引号引用即可,可以是成对的三引号或者三个双引号
5、代码块:目前来看if逻辑判断和for循环条件后面均以冒号结尾,然后通过4个空格开始下一层级的实际执行动作语句编写。这部分在冒号后面接上的语句称为代码块
6、程序命名:编写的Python程序文件必须以.py结尾
7、项目规范:启动一个项目开发时现在开发工具中创建工程(project),然后根据需要创建目录,最后在目录下创建当前活动的py程序
2.2 变量
Python中的变量也用于存储临时值以便后续灵活调用,在定义时只能使用字母、数字、下划线的任意组合,且不能以数字开头,不能以Python内置的关键字来命名变量(如and, import, global, finally等)。对变量进行字符串类型的赋值时,字符串需要用成对的引号引起来,单双、三引号都可以。
建议使用以下两种形式来定义较为复杂的变量,便于阅读:
1、驼峰:即每个单词的首字母大写,其他小写,如HeroName
2、下划线:不同单词之间通过下划线分开:hero_name
2.3 字符编码
字符编码经历了ASCII码 -> Unicode -> UTF-8的演变过程,Python2默认使用ASCII编码,而3.x默认使用UTF-8编码。由于编码问题事关重大,因此强烈建议统一使用万能的UTF-8编码:
在程序的开头明确显式定义:
#!/usr/bin/env python#-*- coding: utf-8 -*-
Windows下编程可以省略第一行,但为了保留移植性建议始终声明变量
虽然Python3.x默认使用UTF-8编码,但还是建议在程序中声明编码格式
以上是结果,下面谈谈为什么强烈建议使用urf-8编码,以及为什么utf-8编码就可以通吃。
众所周知计算机是美国人发明的,因此最早就只有包括所有字母的大小写、数字、必要的特殊符号等合计才127个字符被编码到计算机里,这个编码就是ASCII编码。由于需要进行编码的字符才有127个,因此用7个二进制位就足以搞定了,但8个二进制位才能构成一个完整的字节,因此索性用8个二进制位来进行编码,剩余的一位只好浪费掉。所以ASCCI码只占用一个字符。
随着计算机技术的推广和普及,其他不以英语为官方语言的国家也开始使用计算机了。那么现在问题来了,一个字节的8个bit位只能表示非常有限的字符(设计时只包括所有字母的大小写、数字、必要的特殊符号,其中整数还不能超过255),既有的ASCII编码表里没有包含其他国家的语言字符,但显然也没法强迫全球都使用英语,于是各个国家开始进行本土化改良,设计能满足自己国家需要的编码,如国内的GB2312。这里的改良涉及两个要点,一是原有的一个字节的编码空间要扩充为两个字节甚至更多,二是新的编码还不能与既有的ASCII编码冲突,否则老美要跟你捉急了!你可以想象,中国搞定了一套,日本也搞定了一套,接着是韩国、越南等巴拉巴拉,大家都有自己的编码标准,各自为政,遇到多语言混合使用的场景这编码表还不炸开锅,连同计算机一起傻掉!这时Unicode应运而生。Unicode把所有语言都统一到一套编码里,用两个甚至更多的字节来进行编码(通常用两个字节,搞不定时再喊人加砝码呀),这样就不会再有乱码问题了。
Unicode搞定了多国语言乱码和编码统一的问题,但你会发现如果需要处理的内容全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就不太经济划算。OK,Unicode的演进改良版utf-8就是来解决这个问题的。utf-8的优势在于它使用“可变长编码”,在继续沿用ASCII编码基础上来对1个字节不能搞定的那些语言字符进行编码设计,这样英文还是用1个字节,遇到中文就用3个或者更多的字节来处理。这样既可以保障空间和性能的最大化,还能兼顾老美的老巢和其他非英文的编码兼容问题,一举三得!所以你会发现ASCII其实是utf-8的子集,utf-8向下兼容。
2.4 Python解释器
Python是一门解释性语言,自然不能缺了解释器(类似于JVM)。官方支持Cpython、Jpython、Ironpython和pypy等,默认使用基于C语言实现的CPython。它也是使用最广泛的解释器。
CPython:是用C语言实现Pyhon,是目前应用最广泛的解释器。最新的语言特性都是在这个上面先实现,基本包含了所有第三方库支持,但是CPython有几个缺陷,一是全局锁使Python在多线程效能上表现不佳,二是CPython无法支持JIT(即时编译),导致其执行速度不及Java和Javascipt等语言。于是出现了Pypy。
Pypy:是用Python自身实现的解释器。针对CPython的缺点进行了各方面的改良,性能得到很大的提升。最重要的一点就是Pypy集成了JIT。但是,Pypy无法支持官方的C/Python API,导致无法使用例如Numpy,Scipy等重要的第三方库。这也是现在Pypy没有被广泛使用的原因吧。
而PyPy与CPython的不同在于,别的一些python实现如CPython是使用解释执行的方式,这样的实现方式在性能上是很凄惨的。而PyPy使用了JIT(即时编译)技术,在性能上得到了提升。
Python的解释器:
1、由于Python是动态编译的语言,和C/C++、Java或者Kotlin等静态语言不同,它是在运行时一句一句代码地边编译边执行的,而Java是提前将高级语言编译成了JVM字节码,运行时直接通过JVM和机器打交道,所以进行密集计算时运行速度远高于动态编译语言。
2、PyPy,它使用了JIT(即时编译)技术,混合了动态编译和静态编译的特性,仍然是一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。绝大部分 Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的。
2.5 构建Python的开发环境
构建好包括解释器(虚拟机)和开发工具IDE在内的Python开发环境才便于展开程序开发之旅。
解释器(虚拟机)从Python官方下载安装即可,Windows下安装后需要把Python下bin目录和script目录追加到系统环境变量path中。
真实开发建议使用pycharm工具,需要注意的是选择本地的解释器和项目的默认字符编码。
2.6 模块初识
Python内置了很多模块,同时也可以自定义编写一些好玩的模块,使用模块时需要通过关键字import导入。导入后Python会从系统变量的路径中从前往后一次性查找,首次成功查找匹配后不再进行后续查找。
因此如果需要使用自定义模块,需要特别关注自定义模块的存放位置,底线是只存放在系统变量的一个路径下,否则可能得到以外的结果
2.7 用户输入和格式化输出
用户输入通过input来实现,示例:
hero_name=input("请输入英雄的名称:")print("Hi,",hero_name)
注意:1、3.x版本中input默认接收用户输入的类型为字符串,如果需要使用其他数据类型需要类型转换: age = int(input("请输入年龄:"))2、print输出中可以使用转义符号反斜线\来实现更多的显示效果,如\n表示换行,\t为制表符
字符串的格式化输出
Python中对字符串的格式化输出与C语言相同,借助%来实现:%s表示字符串;%d表示整数;%f表示浮点数;如果输出的字符串中本身需要%,那么需要使用两个连续的%%来输出一个%。
#!/usr/bin/env python#! -*- coding: utf-8 -*-print("英雄的名称为%s"%"八神庵")print("您的年龄是:%d"%18)print("英雄的名称为%s, 年龄是%d"%("草薙京",24))
从上面的示例可以看出,利用print进行格式化输出的基本格式是在需要替换输出的位置用%s,%d等占位符,然后在后面通过%来接上实际替换后需要输出的内容。如果需要替换输出的元素不止一个,则需要在%后面通过一对圆括号把实际替换后需要输出的内容包含进来,同时在每个元素之间用逗号隔开。
2.8 Python的运行逻辑
内存加载代码 -> 语法分析 -> 解释器加载 -> 生成字节码 -> 执行字节码 -> 生成机器码 -> CPU执行
3、开始我们的Python开发之旅
3.1 第一个Python程序
#!/usr/bin/env python#! -*- coding: utf-8 -*-print("Hello World!")
执行结果:
“C:\Program Files\Python35\python.exe” D:/python/Day1/test/HelloWorld.py
Hello world!
Process finished with exit code 0
3.2 if-else判断
3.2.1 if-else语法规范
ifcondition1:command_layer1_1ifcondition2:command_layer2_2else:command_layer2_2else:command_layer1_2
3.2.2 示例程序
#!/usr/bin/env python#! -*- coding:utf-8 -*-user_input=input("请输入用户名:")ifuser_input=="admin":pass_input=input("请输入密码:")ifpass_input=="password":print("登录成功,欢迎回来:%s"%(user_input))else:print("错误的用户名或密码,登录失败!")else:print("错误的用户名或密码,登录失败!")
改良版:
#!/usr/bin/env python#! -*- coding:utf-8 -*-username=input("请输入用户名:\n")password=input("请输入密码:\n")ifusername=="admin"andpassword=="password":print("登录成功,欢迎回来:%s"%username)else:print("登录失败!")
3.2.3 if-elif-else扩展
语法结构:
ifcondition1:statement1elifcondition2:statement2elifcondition3:statement3elsecondition4:statement4
示例程序:
#!/usr/bin/env python#! -*- coding:utf-8 -*-age=input("请输入年龄:")ifage>=18:print("已成年!\n")elifage>=6:print("未成年!\n")else:print("儿童!\n")
3.3 for循环
3.3.1 for循环语法规范
forvariableinlist:loop command
variable表示变量,一般程序中使用i, j等,list表示变化的范围,可以是list列表,一般会考虑使用range函数来表示一个整数序列,如range(5)就表示[0, 5)之间的整数序列。语法规范中同样需要for语句后面的结尾冒号,以及循环体中的4个空格左缩进。
3.3.2 猜数游戏
通过系统生成一个随机数作为预设年龄,对用户提供3次猜测的机会,前两次如果没有猜中给出数字范围大小的提示,如果第3次还没有猜中则给与鼓励提示,同时打印出这个预设的数字,三次当中没有任何一次猜中会给予用户提示。
#!/usr/bin/env python#! -*- coding:utf-8 -*-importrandom#导入随机数模块age=random.randrange(10)#随机生成[0, 9]之间的整数并赋值给变量ageforiinrange(3):ifi<2:guess_num=int(input("猜一猜大黄的年龄:"))ifguess_num>age:print("大了!\n")elifguess_num<age:print("小了!\n")else:print("恭喜,猜中了!\n")break;#跳出循环else:guess_num=int(input("最后一次机会哦:"))ifguess_num==age:print("恭喜,猜对了!\n")else:print("真是不幸运,3次机会已用完。大黄的年龄是:%d\n"%age)
注意:
1、为了便于程序调试可以为age赋一个固定数字做初值
下面进行程序的改进,当用户连续三次猜错后继续给机会,让用户选择继续猜还是直接退出,如果继续则再获得三次猜的机会:
#!/usr/bin/env python#! -*- coding:utf-8 -*-age=24#年龄初值24count=0#计数器,初值为0foriinrange(10):ifcount<3:guess_num=int(input("请输入猜测的数字:"))ifguess_num==age:print("恭喜,猜对了!\n")break;elifguess_num>age:print("大了!\n")else:print("小了!\n")count+=1elifcount==3:continue_flag=input("是否继续玩耍(Y/N):")ifcontinue_flag.lower()=="y":count=0else:print("游戏结束!\n")breakelse:print("尝试次数过多,游戏强制退出!\n")
也可以使用while循环:
count=0whilecount<10:# ..........count+=1
小结
1、Python是一门主流且发展迅猛的开发语言,目前存在2.x和3.x两个版本分支,前端后端都能胜任,功能强大,在互联网公司中应用广泛,值的托付;
2、Python开发需要安装解释器和IDE,建议使用Pycharm。2.x和3.x下的默认字符编码不同,推荐使用utf-8编码,包括程序编码和解释的编码两个层面;
3、系统自带模块和自定编写的模块均可以通过import导入使用;
4、在进行Python开发时,注意代码需要分层体现,第一层顶格编写,第二层左缩进4个空格;
5、input函数用于接收用户输入,默认输入的数据类型是字符串,可以通过int关键字转换为整数。print()函数可以进行简单输出,如果要格式化需要使用%s,%d,%f等来实现;
6、流程控制语句if-else判断和for、while循环都需要注意代码书写格式,流程控制语句关键字必须以冒号结尾,各层级之间需要使用4个空格缩进;
7、continue和break可以分别用于退出当前流程控制和整个循环。
老九学堂出品,转载请私信哦
对于文章内容有不理解的可以添加老九君个人QQ:614940318,请备注来自简书
老九学堂免费C、C++、Java课程地址:
https://study.163.com/courses-search?keyword=%E8%80%81%E4%B9%9D%E5%AD%A6%E5%A0%82