进击的Python【第一章】:Python背景初探与Python基础(一)

Python背景初探                                                           

一、Python起源

 

  Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。
  就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。Guido van Rossum

二、Python是一门什么样的语言

  Python的设计哲学是“优雅”、“明确”、“简单”。在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

  Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。

  一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

  编程语言分为解释型语言和编译型语言,Python是一门解释型语言,同Python一样,Java,C#等都是解释型语言,而C/C++ 等都是编译型语言。

  解释型编译型语言有什么不同呢?简单的说编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。解释型语言,是在运行时编译一句执行一句的语言,所以运行速度相对于编译型语言要慢。打个比方,我要看一本外语书,我可以找翻译把书全部翻译成中文,我再看时就可以非常快速的看了,这是编译型。而解释型是我找翻译,我看一句,翻译给我翻译一句,相对直接看中文就会稍慢。

三、Python的优缺点

  优点:

      Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。

      龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。

      总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。

      那Python适合开发哪些类型的应用呢?

      首选是网络应用,包括网站、后台服务等等;

      其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;

      另外就是把其他语言开发的程序再包装起来,方便使用。

  缺点:  

      任何编程语言都有缺点,Python也不例外。

      第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

      但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。

      第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

      

      这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。

      再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的“商业价值”。那些大公司的代码不愿意开放的更重要的原因是代码写得太烂了,一旦开源,就没人敢用他们的产品了。

四、Python的前景

  先不说话,上图:

  这是TIOBE编程语言社区发布的7月编程语言排名,可见Python已经强势进入最受欢迎语言的前四。Python在国外已经非常普及,虽然进入国内时间较晚,但是近几年普及率迅速提升,从国内各大互联网公司大量的使用Python就可见一斑。所以说,Python的未来一片光明。

Python入门                                                                                              

 一、安装方式

  WINDOWS

1 1、下载安装包
2     https://www.python.org/downloads/
3 2、安装
4     默认安装路径:C:\python27
5 3、配置环境变量
6     【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】
7     如:原来的值;C:\python27,切记前面有分号

  LINUX

系统自带Python环境,可根据情况自行下载源码包安装

二、第一句Python

创建一个.py文件,比如hello.py

1 #/usr/bin/env python
2 # -*-  coding:utf-8 -*-
3  
4 print("hello world!")
5 
6 localhost:~ qiang$ vim hello.py
7 localhost:~ qiang$ python hello.py
8 Hello World!

解释

#/usr/bin/env python
#这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

# -*- coding: utf-8 -*- 
#指定编码类型为utf-8

三、变量与字符编码

 变量的赋值

1 name = "xiaoqiang"
2 name2 = "xiaoqiang2"
3 print("my name is : ", name, name2)
4 name = "xiaoqiang3"
5 print(name)

变量的定义规则:

  • (下划线或字母)+(任意数目的字母、数字或下划线)
  • 变量名必须以下划线或字母开头,而后面接任意数目的字母、数字或下划线。
  • 以下关键字不能声明为变量名
    ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

字符编码

  ASCII码

  ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。

  基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。下表展示了基本 ASCII 字符集及其编码:

  ASCII的最大缺点是只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语,为了适应中文,我国推出了自己编码GB2312。

  GB2312 

  GB2312 也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB 2312。

  GB 2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。

GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 xx7F一条线。总计23940 个码位,共收入21886个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号883 个。P-Windows3.2和苹果OS以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码。

  Unicode

  世界上存在着多种编码方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

  如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。

  Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。

  Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。 

  UTF-8

  为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。

  UTF-8的编码是这样得出来的,以”汉”这个字为例:
  “汉”字的Unicode编码是U+00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8编码是E6B189。

四、Python的交互输入及格式化输出

一个简单的输入

#/usr/bin/env python
# -*-  coding:utf-8 -*-

name = input("name:")
print(name)

格式化输出

name  = input("name:")
age = int(input("age:")) #强制转换为int型变量
job = input("job:")
salary = input("salary:")

info = '''
-----------   info of %s   ---------
Name:%s
Age:%d
Job:%s
Salary:%s
''' % (name, name, age, job, salary)

info2 = '''
-----------   info of {_name}   ---------
Name:{_name}
Age:{_age}
Job:{_job}
Salary:{_salary}
'''.format(_name=name,
              _age=age,
              _job=job,
              _salary=salary)

info3 = '''
-----------   info of {0}   ---------
Name:{0}
Age:{1}
Job:{2}
Salary:{3}
'''.format(name, age, job, salary)

print(info, info2, info3)

密码的隐藏输入

1 import getpass
2 
3 password = getpass.getpass("请输入密码:")
4 print(password)

这里使用到了getpass模块,模块用import语句调用,具体模块内容以后会讲。

 五、流程控制

  条件判断:if...elif...else

  举个栗子~

1 age_of_oldboy = 56    #定义变量
2 guess_age = int(input("guess age:"))    #用户输入值并赋值给变量
3 if guess_age == age_of_oldboy:    #判断用户输入的和已定义变量的值是否相等
4     print("yes,you got it.")
5 elif guess_age > age_of_oldboy:   #上一个条件如果不符合再次判断
6     print("think smaller...")
7 else:                             #如果上面两条都不符合,执行最后语句
8     print("think bigger!")

   while循环语句

  再举个栗子:

 1  #猜数字游戏
 2  #三次机会,猜对直接退出,猜错三次直接退出
 3 
 4 age_of_oldboy = 56
 5 count = 0
 6 while True:
 7      if count == 3:
 8          break
 9      guess_age = int(input("guess age:"))
10      if guess_age == age_of_oldboy:
11          print("yes, you got it.")
12          break
13      elif guess_age > age_of_oldboy:
14          print("think smaller...")
15      else:
16          print("think bigger!")
17      count +=1

   for循环语句

   还是上面猜数字的栗子:

 1  #猜数字游戏
 2  #三次机会,猜对直接退出,猜错三次直接退出
 3 
 4 age_of_oldboy = 56
 5 
 6 for i in range(3):
 7      guess_age = int(input("guess age:"))
 8      if guess_age == age_of_oldboy:
 9          print("yes, you got it.")
10          break
11      elif guess_age > age_of_oldboy:
12          print("think smaller...")
13      else:
14          print("think bigger!")
15 else:
16     print("you have tried too many times...")

 

 

 

posted @ 2016-07-26 23:09  Ethan_Cheng  阅读(1695)  评论(0编辑  收藏  举报