Python简介和基础入门

1.1 Python是什么

      相信混迹IT界的不少朋友都知道,Python是近年来最火的一个热点,没有之一。从性质上来说它和咱们熟知的C、java、php等没有什么本质的区别,也是一种开发语言,并且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜)。php

       来头不小啊!二十多种主流的开发语言,我该从哪个开始呢?人生苦短,let‘s python! 前端

1.2 Python的由来和发展趋势

      Python的前世源自鼻祖“龟叔”。1989年,吉多·范罗苏姆(Guido van Rossum)在阿姆斯特丹为了打发无聊的圣诞节,决心开发一个新的脚本解释程序,自此Python和创始人“龟叔”开始进入公众视野。他但愿这个新的叫作Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。java

      1991年,第一个Python编译器诞生。它基于C语言实现,并可以调用C语言的库文件。后面历经版本的不断换代革新,Python走到了很是具备里程碑意义的一个节点,即2004的2.4版本诞生了目前最流行的WEB框架Django!六年后Python发展到2.7版本,这是目前为止2.x版本中最新且较为普遍使用版本。python

      2.7版本的诞生不一样于以往2.x版本的垂直换代逻辑,它是2.x版本和3.x版本之间过渡的一个桥梁,以便最大程度上继承3.x版本的新特性,同时尽可能保持对2.x的兼容性。linux

      所以3.x版本在2.7版本以前就已经问世,从2008年的3.0版本开始,python3.x系呈迅猛发展之势,版本更新活跃,一直发展到如今最新的3.5.2版本。3.5版本也是目前3.x系列中主流且普遍使用的版本,后续相关程序的demo,默认均基于3.5版本展开。web

1.3 Python 2 VS Python 3

      许多初学者会纠结于从2.x版本仍是3.x版本开始python学习之路。这里简要对比下我的学习了解到的二者的差别:shell

              3.x版本中 PRINT IS A FUNCTION,使用起来更简单方便;数据库

              3.x版本中默认使用unicode编码,妈妈不再用担忧你的程序编码问题了;编程

              3.x版本中某些库进行了更名,具体还有待在后续学习中深刻展开;windows

              目前3.x版本还不能彻底支持Twisted module,这恐怕是3.x版本中最大的遗憾。也不要过于纠结这点,听说官方正在弥补这个不足,同时也相信能有办法解决的:)

      In summary : Python 2.x is legacy, Python 3.x is the present and future of the language. 长江后浪推前浪,python的将来是属于3.x系列的,官方宣布2020年以后再也不支持2.x系列中最nb的2.7版本,2.x版本将逐渐寿终正寝,最终被铭刻在开发语言的丰碑上。

      因此学习3.x版本没错的!         

1.4 Python的优缺点

      二十多种主流开发语言,python何以能在20多年间以如此迅猛之势横扫七大洲八大洋呢?这都是它自身优良的特性决定的.

      Python优势:

1.“优雅”、“明确”、“简单”

      这是python的定位,使得python程序看上去简单易懂,初学者容易入门,学习成本更低。但随着学习的不但深刻,python同样能够知足胜任复杂场景的开发需求。引用一个说法,Python的哲学是就是简单优雅,尽可能写容易看明白的代码,尽可能写少的代码。

2.  开发效率高

     python做为一种高级语言,具备丰富的第三方库,官方库中也有相应的功能模块支持,覆盖了网络、文件、GUI、数据库、文本等大量内容。所以开发者无需事必躬亲,遇到主流的功能需求时能够直接调用,在基础库的基础上施展拳脚,能够节省你不少功力和时间成本,大大下降开发周期。

3.  无需关注底层细节

     Python做为一种高级开发语言,在编程时无需关注底层细节(如内存管理等)。

4.  功能强大

     Python是一种前端后端通吃的综合性语言,功能强大,php能胜任的角色它都能作,至于后端如何胜任,须要在后续学习中逐步领悟。

5.  可移植性

     Python能够在多种主流的平台上运行,开发程序时只要绕开对系统平台的依赖性,则能够在无需修改的前提下运行在多种系统平台上,具体有待后续学习中深刻展开。其余优势有待继续发掘。

 

     一个硬币总有两面,那么Python有缺点吗?答案是确定的,总结以下:

      Python缺点:

1. 代码运行速度慢

    由于Python是一种高级开发语言,不像c语言同样能够深刻底层硬件最大程度上挖掘榨取硬件的性能,所以它的运行速度要远远慢于c语言。另一个缘由是,Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程很是耗时,因此很慢。而C程序是运行前直接编译成CPU能执行的机器码,因此很是快。

    但须要注意的是,这种慢对于不须要追求硬件高性能的应用场合来说根本不是问题,由于它们比较的数量级根本不是用户能直观感觉到的!想一想程序执行所需的时间数量级?例如开发一个下载MP3的网络应用程序,C程序的运行时间须要0.001秒,而Python程序的运行时间须要0.1秒,慢了100倍,但因为网络更慢,须要等待1秒,用户体验几乎没有差异,除非你用很是精确的计时器来计时。

2.  发布程序时必须公开源代码

     什么?有没有搞错?是的,发布程序时咱们必须公开源代码!仍是由于Python是一种解释性语言,没有编译打包的过程(听说最新的python能够打包,但本质上仍是把源代码和解释器打在一块儿,没有太大实际意义)。想一想咱们的shell脚本是否是也是这个状况,你能在不发布源代码的状况下发布一个黑盒子程序来让别人正常使用么?

     这个缺点仅限于你想单纯靠卖开发出来的软件产品挣钱的时候。但在这个开发互联的时代,不靠卖产品自己来赚钱的商业模式愈来愈主流了,因此问题也不是无法解决。 

     总结起来,Python的优势多于缺点,并且缺点在多数它能胜任的状况下不是根本性问题,瑕不掩瑜,尽情享受它给咱们带来的乐趣和便利吧!                

1.5 Python的适用领域

     Python典型的适用领域以下:

1. 云计算开发

    云计算领域最火的语言,典型表明openstack。

2. web开发

    众多优秀的web框架,众多优秀的大型web站点(Youtube,instagrm,豆瓣等)均基于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.1 编程开发规范

     做为一门开发语言,python天然也有本身的编程规范,如下是特有且必须遵循的规范:

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. 驼峰体

    即每一个单词的首字母大写,其余小写,如MappingTable

2. 下划线

    不一样单词之间经过下划线分开,如mappting_table

2.3 字符编码

  字符编码经历了ASCII码->unicode->UTF-8的演变过程,python 2.x默认使用ASCII编码,而3.x默认使用UTF-8编码。因为字符编码事关重大,一言不合就会致使乱码,所以强烈建议统一使用万用的utf-8编码。怎么使用呢?

    1. 程序开头明确显式定义

?
1
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-  

        windows下编程可忽略第一行,但为了保留移植性建议始终声明变量。

    2. 在程序解释器中选择utf-8字符编码

    以上两个条件缺一不可,虽然python 3.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。它也是最为普遍使用的解释器。程序运行时会把.py文件转换成.pyc字节码文件,而后运行在python虚拟机上。

2.5 构建Python的开发环境

  构建好包括解释器(虚拟机)和开发工具IDE在内的Python的开发环境才便于展开程序开发之旅。

    其中解释器(虚拟机)从python官方下载安装便可,须要注意的是建议安装3.5版本,windows下安装后须要把python的bin目录和scripts目录追加到系统环境变量path和用户变量path中。个人win 7用户不是以administor,补充追加了用户变量后才能在cmd下傻瓜式地输入python。linux下系统默认是2.x的版本,安装3.5版本时须要先将旧版本重命名为其余目录(如python2.6)后再安装,安装完毕无需额外设置环境变量。

    好的程序猿都得有本身好使的IDE,python程序建议使用pycharm工具来进行开发。从官网下载安装社区版便可,须要注意的是选择后本地的解释器和项目的默认字符编码。其余一些好玩的特性、快捷键等只有后续逐步体会了。

2.6 模块初识

  python内置了不少模块,同时也能够自定义编写一些好玩的模块,使用模块时须要经过关键字import导入。导入后python会从系统变量的路径中从前日后一次查找,首次成功查找匹配后再也不进行后续查找。所以若是须要使用自定义模块,须要特别关注自定义模块的存放位置,底线是只存放在系统变量的一个路径下,不然可能获得意外的结果。

    系统变量的路径可经过如下方式查看:

    

 

   以上是windows下3.5版本的输出结果,linux平台或者其余版本的输出有所差异,以实际为准。

2.7 用户输入和格式化输出

    用户输入经过input来实现,示例以下:

     YourName=input("Please input you name here: ") 

     简单的输出经过print来实现,示例以下:

     print("Hi,", YourName)  #调用输出上面用户输入的变量YourName

     注意:

     1.  3.x版本中input默认接收用户输入的类型为字符串,若是须要使用其余的数据类型则须要进行转换,如 UserAge=int(input("Please input your name:"))

     2.  print输出中能够接上转义符号\来实现更多的输出显示效果,如 \n表示换行,\t为制表符。

     print的使用进阶——字符串的格式化输出:

     python中,对字符串进行格式化输出与c语言是相同的,即借助%来实现。%s表示与字符串替换,%d表示用整数替换,%f表示用浮点数替换,若是输出的字符串中自己就须要%(好比输出比率),则须要用连续的两个%%来输出%。

     示例程序以下:

?
1
2
3
4
5
#!/usr/bin/env python
#-*- coding:utf-8 -*-
print ( "Your name is %s" % "Bob" )
print ( "Your age is %d" % 21 )
print ( "Your name is %s,age is %d" % ( "Bob" , 21 ))

     从以上示例程序可看出,利用print进行格式化输出的基本格式是在须要替换输出的位置用%s,%d等占位符,而后在后面经过%来接上实际替换后须要输出的内容,若是须要替换输出的元素不止一个,则须要在%后面经过一对圆括号把实际替换后须要输出的内容包含进来,同时在每一个元素之间用逗号隔开。 

2.8 Python的运行逻辑

    Python的运行工做逻辑以下:

    内存加载代码->语法分析->解释器加载->生成字节码->执行字节码->生成机器码->CPU执行

 

3.1 第一个Python程序--HelloWorld

  python的第一个程序也从hello world开始把:

?
1
2
3
#!/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语法规范

     如下是if-else判断的语法结构规范

?
1
2
3
4
5
6
7
8
if condition1:
     command_layer1_1
     if condition2:
         command_layer2_2
     else :
         command_layer2_2
else :
     command_layer1_2  

3.2.2 示例程序

      如下为一个演示两层if-else循环的程序:

?
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python                                         #顶格编写
#! -*- coding:utf-8 -*-
user_input = input ( "Please input you username:" )
if user_input = = "Bob" :                                       #注意这里的冒号结尾
     passwd_input = input ( "Please input your password:" )       #注意从这里开始,第一个if条件为真时须要执行的动做语句均须要左缩进4个空格
     if passwd_input = = "password" :                            #第一个if下的第二个if,仍然要左缩进4个空格,同时冒号结尾
         print ( "Welcome login,%s!" % user_input)                #第二层if条件为真时执行的动做语句,须要在第一层语句基础上再缩进4个空格,所以须要缩进8个空格
     else :                                                     #第二层if-else中的else,所以须要与第二层if对齐,缩进4个空格
         print ( "Invalid username or password, please check your input" ) #第二层if-else条件为假时执行的动做语句,一样须要与第二层if同样缩进8个空格
else :                                                         #第一层if-else中的else关键字,顶格冒号结尾
     print ( "Invalid username or password, please check your input" ) #第一层if-else判断条件为假时执行的动做,与第一层if同样须要缩进4个空格
  说明:该示例程序仅为演示多层if-else的语法结构,程序自己的设计存在漏洞;空格缩进在pycharm IDE环境中会被自动处理,但在普通文件编辑器中须要手动设置。
如下为改良版示例程序,经过引入对if的多条件判断来避免上述程序的漏洞:
 
1 #!/usr/bin/env python
2 #! -*- coding:utf-8 -*-
3 username=input("Please input you username:\n")
4 passwd=input("Please input you password:\n")
5 if username == "Bob" and passwd == "password":
6     print("Welcome login, %s!" %username)
7 else:
8     print("Invalid username or password, please check your input!")
复制代码
  此时只有用户名和密码同时输入正确了才会给出相应提示,不然均提示口令无效,避免暴力破解。

3.2.3 if-elif-else扩展

    上述判断均为单一式的if-else判断,如下为if-elif-else的判断扩展:
语法结构:
?
1
2
3
4
5
6
7
8
if condition1:
     command1
elif condition2:
     command2
elif condition3:
     command3
else condition4:
     command4
    不过这种结构仅仅适用于单一条件存在多种case状况下,语法结构看起来仍是比较简单,固然顶格、左缩进4个空格和冒号这些规范同样要遵循。
仍是来一个示例程序加深理解:
?
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
#! -*- coding:utf-8 -*-
age = int ( input ( "Please input your age\n" ))
if age > = 18 :
     print ( "Oh, you're an adult\n" )
elif age > = 6 :
     print ( "Ha, you're a teenager\n" )
else :
     print ( "Come on, little kid!\n" )

3.3 For循环

3.3.1 for循环语法规范

      For循环的基本语法规范是:

?
1
2
for variable in XXX:
     loop command

 

其中variable表示命名的变量,通常程序中使用i,j等等,XXX表示变化的范围,能够是list列表,通常会考虑使用range函数,来表示一个整数序列,如range(5)就表示小于5的整数序列,即0-4。 语法规范中一样须要for语句后面的结尾冒号,以及循环体中的4个空格的左缩进。

3.3.2 示例程序

      猜数字游戏,经过系统生成一个随机数做为预设年龄,对用户提供3次猜的机会,前两次若是没有猜中给出数字范围大小的提示,若是第3次尚未猜中则给予鼓励提示,同时打印出这个预设的数字,固然三次当中有任何一次猜中会给用户猜中提示的:

 1 #!/usr/bin/env python
 2 #! -*- coding:utf-8 -*-
 3 import random #导入随机数模块
 4 Age=random.randrange(10)#随机生成一个小于10的整数(0-9,不包括负数),并赋值给Age
 6 for i in range(3):
 7     if i < 2:
 8         guess_number=int(input("Please input the age of my dog you guess:\n"))
 9         if guess_number > Age:
10             print("The age you guess is a little big, think smaller!\n")
11         elif guess_number < Age:
12             print("The age you guess is a little small, think bigger!\n")
13         else:
14             print("Bingo, you got the number,congratulations!\n")
15             break
16     else:
17         guess_number=int(input("Please input the age of my dog you guess:\n"))
18         if guess_number == Age:
19             print("Bingo, you got the number,congratulations!\n")
20         else:
21             print("Oh,you just got bad luck, come to try again, you can do it! The actual age of my dog is %d...\n"% Age)

 注意:

1.为便于程序调试可先对Age赋值固定的数字

2.前两次若是猜中了就须要退出循环,这里使用了break关键字,意思是跳出整个循环,与之相对应的还有continue关键字,用于跳出当次循环,两者的使用区别还有待进一步深刻学习

   OK,如今来改进下程序, 当用户连续三次猜错后继续给机会,让用户选择是继续猜仍是直接退出,若是继续则再一次得到三次猜的机会,如此循环下去。仍是用for循环吧:

 1 #!/usr/bin/env python
 2 #! -*- coding:utf-8 -*-
 3 Age=22
 4 counter=0
 5 for i in range(10):
 6     if counter < 3:
 7         guess_number=int(input("Plese input your guess number:\n"))
 8         if guess_number == Age:
 9             print("You got the number, congratulations!")
10             break
11         elif guess_number > Age:
12             print("The number you guessed is too big, guess a smaller one\n")
13         else:
14             print("The number you guessed is too small, guess a bigger one\n")
15         counter += 1
16     elif counter == 3:
17         continue_flag=input("Do you want to continue? Please type Y to continue or N to quit:\n ")
18         if continue_flag == "Y":
19             counter = 0
20         else:
21             print("Bye")
22             break
23     else:
24         print("You've tried too many times.")

    这里为了保证每个轮回中的第四次(上述程序中的第四次和第八次)能让程序继续循环,引入了另一个变量来进行计数并重置。把for循环换做while循环看起来差很少:

 1 #!/usr/bin/env python
 2 #! -*- coding:utf-8 -*-
 3 Age=22
 4 i=0
 5 counter=0
 6 while counter < 10:
 7     if i < 3:
 8         guess_number=int(input("Plese input your guess number:\n"))
 9         if guess_number == Age:
10             print("You got the number, congratulations!")
11             break
12         elif guess_number > Age:
13             print("The number you guessed is too big, guess a smaller one\n")
14         else:
15             print("The number you guessed is too small, guess a bigger one\n")
16         i += 1
17     else:
18         continue_flag=input("Do you want to continue? Please type Y to continue or N to quit:\n ")
19         if continue_flag == "Y":
20             i = 0
21         else:
22             print("Bye")
23             break
24     counter +=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个空格,第二层8个空格,以此类推;

7.continue和break可分别用于退出当前(当次)流程控制和整个循环,课堂上演示了在for循环中的使用,在if-else判断中不能使用。

相关文章
相关标签/搜索