进击的Python【第一章】:Python背景初探与Python基础(一)
Python背景初探
一、Python起源
二、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汉字字符集的出现。
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个字节就够了。
四、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...")