Python简介
python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白。大家都知道,当下全栈工程师的概念很火,而Python是一种全栈的开发语言,所以你如果能学好Python,那么前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。
为什么选择Python
关于语言的选择,有各种各样的讨论,在这里我不多说,就引用Python里面的一个彩蛋来说明为什么要选择Python,在Python解释器里输入import this 就可以看到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
上面的话简单的总结来说就是“优雅”、“明确”、“简单”,或许你还是有些不明白,举个简单的例子,若果同样的功能你用C/C++写可能要写100行代码,而如果用Python写你可能只要20行代码就搞定,同样的如果一个问题有好几种解决方案,但是Python会用一种最简单的方法来实现。所以Python是用最简单最优雅最明确的方法来解决问题。
Python入门
一、Python 2.x vs 3.x区别
1.print在python2.x是语句,在python3.x是print()函数
1 2 3 4 5 6 7 8 9 10 | |
2.python3.x全部字符集都是unicode,而在python2.x中是ascii编码,需要设置#-*- coding:utf-8 -*-,中文才不会乱码
3.python2.x一些库名在python3.x的更改
python2.x | _winreg | ConfigParser | copy_reg | Queue | SocketServer | markupbase | repr | test.test_support |
python3.x | winreg | configparser | copyreg | queue | socketserver | _markupbase | reprlib | test.support |
4.python3.x有一些第三方模块支持不了,当然还有其他的模块,后续慢慢添加....
Twisted urllib2 scrapy MySQLdb
5.python2.x与python3.x库方法的不同,在后续慢慢体现....
二、安装Python
在这里我我推荐安装Python3,因为随着时间的推移Python3,必定是未来的趋势,我们要顺应潮流。在Python的官网可以下载相应的版本,网址是https://www.python.org/downloads/,安装上面的提示安装好即可,就不在多说了,此外后面的操作都是基于Ubuntu 15.10下Python3.5.1操作,默认是Python2.7.10版本
建议使用pyenv(Python版本控制2.7和3.5之间随意切换)、virtualenv(Python虚拟环境)、pycharm(Python的IDE工具)、pip(Python包管理工具)。
windows
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
三、编写Hello,World
两种方式输出Hello World,第一种我们用解释器交互式环境,打开shell输入python。
1 2 3 4 5 6 | |
第二种将代码保存在 .py文件中,命令行下执行 python1.py 就可以打印出来Hello World。
1 2 3 4 5 6 7 8 | |
在Linux下执行的时候,第一行指出文件由python解释器来执行,第二行是告诉解释器在加载文件时,采用何种编码,不加上这句的话,在python2中显示中文会出现乱码,在python3中则不会,所以你如果用的是windows而且用的是python3,其实可以不用加这两句,不过实际中还是建议加上这两句。到这里我们就用了两种方式输Hello World。
四、变量&字符编码
变量
常量我们约定俗成都为大写
1、变量声明:
- Python将所有数据存为内存对象
- Python中,变量事实上是指向内存对象的引用
- 动态类型:在任何时刻,只要需要,某个对象引用都可以重新引用一个不同的对象(可以是不同的数据类型)内建函数type()用于返回给定数据项的数据类型
- "="用于将变量名与内存中的某个对象绑定:如果对象实现存在,就直接进行绑定;否则,则由"="创建引用的对象,变量名也是对象存在内存,比如:name='jerry',name这个指针指向jerry,name='tom'的时候,name是指针指向tom,但是jerry仍在内存中存放着,只是没有被变量名指向,到一定时候会被垃圾收集器回收,和java有点像。其中当test='jerry'时,test和name这两个变量名指向内存的地址是一样的。id(test),id(name),变量名是内存引用的标识或符号。
2、变量定义的规则:
- 变量名只能是 字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- 以下关键字不能声明为变量名
['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']
# 通过Import keyword查看
import keyword
print(keyword.kwlist)
3、变量最佳命名方式:
- 使用下划线'_'作为连接,如 name_variables
- 使用大小写,称为驼峰法,如 NameVariables,nameVariables
注意:两种命名方式不要混用,只要你喜欢的一种即可
4、变量命名惯例:
- 以单一下划线开头的变量名(_x)不会被from module import * 语句导入
- 以两个下划线开头但结尾没有下划线的变量名(__x)是类的本地变量
- 前后有双下划线的变量名(__x__)是系统定义的变量名,对python解释器有特殊意义
- 交互式模式下,变量名"_"用于保存最后表达式的结果
字符编码
1、ASCII
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号,python2.x解释器默认是ASCII编码。
显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
二进制和数字转换:128 64 32 16 8 4 2 1 比如:2表示二进制 0000 0010
字符和数字转换 : 查看ASCII码表 比如: A字母 表示数字是65,二进制是0100 0001
2、Unicode
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定所有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,注:此处说的的是最少2个字节,可能更多,比如汉字就需要3个字节,python3.x解释器默认是Unicode编码。
3、UTF-8
是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行动态分类:ASCII码中的内容用1个字节保存、欧洲的字符用2个字节保存,汉字用3个字节保存...
所以,python2.x解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII),如果是如下代码的话:
报错:ascii码无法表示中文
1 2 3 4 5 6 | |
改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:
1 2 3 4 5 6 7 | |
注意:python3.x中字符集默认为UTF-8,python2.x还是ASCII所以需要设置#coding:utf-8
五、输入、输出、注释
Python输入:
1、Python3.x提供了一个input(),可以让用户输入字符串。比如输入用户的名字:
python3中格式化输出默认接收的都视为字符串,如果你获取的是要数字类型则需要另外强制转换为int()转换为数字类型才能获得数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
输入密码时,如果想要不可见,需要利用 getpass 模块中的 getpass 方法,即:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
注意:在pycharm IDE工具中这段代码是行不通的,在Linux命令行或者Windows cmd中是可以的
2、Python2.x提供了一个raw_input()和input(),input()在python2中基本不用忘了吧,当然我这里会演示他们的区别
raw_input()在字符串和数值型都没有问题
1 2 3 4 5 6 7 8 9 | |
input()在输入字符串的时候报错,变量未定义,数值型则没有报错,如果是字符串则需要引号'' or "",或者事先定义变量赋值

>>> name = input("please input your name:")
please input your name:tomcatxiao
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'tomcatxiao' is not defined
>>> age = input("your age is:")
your age is:21
对于上面的代码进行修改下,将字符串事先赋值给一个变量,然后从input中输入则没有报错
>>> myname = "tomcatxiao"
>>> name = input("please input your name:")
please input your name:myname
>>> print name
tomcatxiaoPython输出:
Python中输出是用print,Python2.x中print是语句,Python3.x中则是print()函数
1.Python2.x
1 | |
2.Python3.x
1 | |
3.拼接效率比较低
1 2 | |
input()和格式化输出时要特别要注意input()输入是个数字需要int()转换,格式化输出的时候使用%d才不会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
注意:python3中格式化输出默认接收的都视为字符串,如果是数字则需要另外强制转换为int()转换为数字类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
这里的Age用%d进行格式化如果没有强制转换为数字则会报错,执行上面的代码则会报错,int()转换了则不会报错
1 2 3 4 5 6 7 | |
注释
#号可以从一行的任何地方开始
'''''',"""""",三引号用于多行注释
\,表示续行符
注意:如果''''''三引号是在一个def 函数或者class 定义类的下方则是对这个函数或者类的说明,可以通过__doc__动态获得文档子串
六、模块初识
Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的。
sys
1 2 3 4 5 6 7 8 9 10 11 12 | |
os
1 2 | |
注意:os.system()执行系统命令,如果有变量存储该执行的结果,该变量只会存储该命令执行成功或者失败返回值,不会存储命令执行的结果,os.system("df -h")会有返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
如果需要保存命令执行的结果需哟使用os.popen("系统命令").read(),然后使用变量赋值输出即可
1 2 3 4 5 6 7 8 9 10 11 12 | |
sys与os结合使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
自己写个补全模块tab.py适合python2.x,python3.5都有自带补全功能

#!/usr/bin/env python
# python startup file
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind('tab: 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
写完后保存,导入就可以使用

tomcat@node:~$ python
Python 2.7.11 (default, Jul 27 2016, 18:09:58)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tab
>>> import os
>>> os.
Display all 238 possibilities? (y or n)
os.EX_CANTCREAT os.fchdir(
os.EX_CONFIG os.fchmod(
os.EX_DATAERR os.fchown(
os.EX_IOERR os.fdatasync(
os.EX_NOHOST os.fdopen(
你会发现,上面自己写的tab.py模块只能在当前目录下导入,如果想在系统的何何一个地方都使用怎么办呢? 此时你就要把这个tab.py放到python全局环境变量目录里啦,用sys.path可以查看,ubuntu是在/usr/lib/python2.7/dist-packages/,centos是在/usr/lib/python2.7/site-packages/
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-kylin-sso-client', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
七、If语句与流程控制
python的比较操作:
所有的Python对象都支持比较操作:
- 可用于测试值相等、相对大小等
- 如果是复合对象,python会检查其所有部分,包括自动遍历各级嵌套对象,知道可以得出最终结果
测试操作符:
- "==" 操作符测试值的相等性
- "is" 表达式测试对象的一致性
- "in" 成员关系测试
如何实现比较操作:
python中不同类型的比较方法:
- (1)数字:通过相对大小进行比较
- (2)字符串:按照字典次序逐次进行比较
- (3)列表和元组:自左至右比较各部分内容
- (4)字典:对排序之后的(键、值)列表进行比较
python中真和假的含义:
- (1)非0数字为真,否则为假
- (2)非空对象为真,否则为假
- (3)None则始终为假
比较和相等测试会递归地应用于数据结构中
返回值为True或False
组合条件测试:
- X and Y: 与运算
- X or Y: 或运算
- not X : 非运算
if测试的语法结构:
if boolean_expression1:
suite1
elif boolean_expression2:
suite2
else:
else_suite注意:
elif语句是可选的
仅用与占位,而后在填充相关语句时,可以使用pass
if/else三元表达式:
通常在为某变量设定默认值时通常用到如下表达式
A = X if Y else Z或:
if Y:
A = X
else
A = Z其通用条件表达式语法格式为:
expression1 if boolean_express else expression2如果boolean_express的值为True,则条件表达式的结果为express1,否则为express2
八、循环for,while
循环机制及应用场景
while循环:
- (1)用于编写通用迭代结构
- (2)顶端测试为真即会执行循环体,并会重复多次测试知道为假后执行循环后的其他语句
for循环:
- (1)一个通用的序列迭代器,用于遍历任何有序的序列对象内的元素
- (2)可用于字符串、元组、列表和其他的内置可迭代对象,以及通过类所创建的新对象
python也提供了一些能够进行隐性迭代的工具:
- (1)in成员关系测试
- (2)列表解析
- (3)map、reduce和filter函数
break: 跳出最内层的循环
continue: 跳出所处的最近层循环的开始处
pass: 占位语句
外层变量,可以被内层代码使用
内层变量,不应被外层代码使用
while循环:
while True: 死循环
语法格式:
while boolean_express:
while_suite
else:
else_suite注意:
- else分支为可选部分
- 只要boolean_express的结果为True,循环就会执行
- boolean_express的结果为False时终止循环,此时如果有else分支,则会执行

示例1:
>>> url = 'www.mageedu.com'
>>> while url:
print(url)
url = url[1:]
示例2:
>>> x = 0;y = 100
>>> while x < y:
print(x)
x += 1
示例3:
>>> url = 'www.mageedu.com'
>>> while url:
print(url)
url = url[:-1]
else:
print('game over')
while大量练习:

View Code
for循环:
语法格式:
for expression1 in iterable:
for_suite
else:
else_suite通常,expression或是一个单独的变量,或是一个变量序列,一般以元组的形式给出
如果以元组或列表用于expression,则其中的每个数据项都会拆分到表达式的项
T = [(1,2),(3,4),(5,6),(7,8)]
for (a,b) in T:
print(a,b)编写循环的技巧:
(1)for循环比while循环执行速度快
(2)python提供了两个内置函数,用于在for循环中定制特殊的循环python3.x 只有range,python2.x有(range,xrange)
- range: 一次性地返回连续的整数列表
- xrange: 一次产生一个数据元素,相较于range更节约空间
- zip:返回并行的元素元组的列表,常用于在for循环中遍历数个序列
range()函数:非完备遍历
用于每隔一定的个数元素挑选一个元素
>>> S = 'How are you these days?'
>>> range(0,len(S),2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
>>> for i in range(0,len(S),2):
print(S[i])修改列表
>>> L = [1,2,3,4,5]
>>> for i in range(len(L)):
L[i] += 1
>>> L
zip()函数:并行遍历
取得一个或多个序列为参数,将给定序列中的并排的元素配成元组,返回这些元组的列表
当参数长度不同时,zip会以最短序列的长度为准
1.可在for循环中用于实现并行迭代
>>> L1 = [1,2,3,4,5,6,7]
>>> L2 = ['a','b','c','d','e','f','g']
>>> zip(L1,L2)2.zip也常用于动态构造字典
>>> keys = [1,2,3,4,5,6,7]
>>> vaules = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
>>> D = {}
>>> for (k,v) in zip(keys,values)
D[k] = v
>>> Dfor大量练习:

View Code
场景一、用户登陆验证

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import getpass
name = 'tom'
pwd = 123456
count = 0
while True:
if count < 3:
print("Please enter your name and password !")
username = input("username:")
password = getpass.getpass("password:")
if username == name and password == pwd:
print("恭喜你登陆成功!")
break
else:
print("登陆失败!用户名或者密码错误")
else:
print("你已经输错3次,正在退出....")
break
count += 1
场景二、猜年龄游戏

#!/usr/bin/env python
# -*- coding:utf-8 -*-
age = 22
count = 0
for i in range(10):
if count < 3:
a = int(input("please input num:"))
if a == age:
print("恭喜你,答对了")
break
elif a > age:
print("你猜的数字大了")
else:
print("你猜的数字小了")
else:
b = input("你太笨了,这都猜不对,你继续玩吗?(yes or not):")
if b == 'yes':
count = 0
continue
else:
print("Bye!下次再玩")
count += 1
















