Python 是著名的 “龟叔” Guido van Rossum 在 1989 年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
Python 的火热度怕是大家已经早已感受到了,很多程序员将 Python 作为了他的第二语言,如果你至今还未接触任何和 Python 相关的知识,那么今天我带给你的这篇文章可以让你快速了解 Python 语法,上手做东西了。
Python 语言的特点
Python 是一种解释性语言
编译型语言:在程序执行前,会通过编译器将程序(代码)转换为机器语言(计算机可以看懂的语音),比如C语音。
解释型语言:没有编译过程,在程序执行的时候通过解释器对程序逐行解释然后直接运行。
比较:因为编译型语音在执行前已经做了编译(翻译给计算机),所以执行比较快(执行过程中不需要翻译)。
事实上,解释性语言还有一个缺点就是不能实现加密,如果要发布你的 Python 程序,实际上就是发布源代码,这一点跟 C/Java 等语言不同。当然了我们也不需要在意这些,如果你要写一个程序卖给别人可能会造成影响,大多数商业模式是售卖服务,所以不存在源码公开问题。
Python 是面向对象的语言
面向过程:一般就是先分析解决问题需要的步骤,然后用函数把这些步骤一步步实现,然后依次调用(比较接近计算机的思考方式)。
面向对象:把问题中的各个事物分解(抽象)成各个对象,通过对象之间交互来实现(和我们人类的思考方式更接近)。
Python 比较适合初学者
Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
Python开发环境搭建
安装
Python 官网:https://www.python.org/
Python 可应用于多平台包括 Linux 和 Mac OS X。
你可以通过终端窗口输入 python
命令来查看本地是否已经安装 Python 以及 Python 的安装版本。
- Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)
- Win 9x/NT/2000
- Macintosh (Intel, PPC, 68K)
- OS/2
- DOS (多个DOS版本)
- PalmOS
- Nokia 移动手机
- Windows CE
- Acorn/RISC OS
- BeOS
- Amiga
- VMS/OpenVMS
- QNX
- VxWorks
- Psion
windows 通过 win+q 快捷键打开 python
IDLE 是 Python 软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试 Python 程序。
第一个 Python 程序
第一个 python 程序
在 IDLE 中输入编写 python 的第一个程序在控制台输入 hello world
,接下来我们看在 windows 命令行如何执行 python.
为了在命令行执行 python 方便首先需要配置一下环境变量:
配置环境变量
启用 command line (命令行):
启用 command line
在命令行输入 python,然后编写我们的 helloworld 程序:
命令行书写python的第一个程序
在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍。所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样,程序就可以反复运行了。
Python 的数据类型
变量
变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。变量的本质是内存中一段存储空间(大小由数据类型决定),变量名和这段存储空间的地址发生关联。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。
定义变量
Python 中的变量赋值不需要类型声明。
每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。
每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值
1
2
3
4
5
6
7
8
9
10
| #!/usr/bin/python
#-*- coding: UTF-8 -*-
counter = 100 # 赋值整型变量
miles = 1000.0 # 浮点型
name = "John" # 字符串
print counter
print miles
print name
|
好奇的你可能会发现,上面有两行注释:
1
2
| #!/usr/bin/python
#-*- coding: UTF-8 -*-
|
第一行注释是为了告诉 LINUX/UNIX
去这个路径找到 python 的翻译器,这个注释必须放在文件首行。
第二行注释是说明如何解释字符串的编码,当你的 python 源文件中出现中文的时候你必须声明一下编码。
为了避免不必要的麻烦,所以一般情况下我们默认添加上面两行注释给系统和编译器看。
Python 标准数据类型
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元祖)
- Dictionary(字典)
Number(数字)
- int (有符号整型)
- long(长整型)
- float(浮点型)
- complex(具有实部和虚部的复数)
除了 int 和 float,Python也支持其他类型的数字,例如 Decimal(高精度) 或者 Fraction(分数)。
String(字符串)
字符串或串 (String) 是由数字、字母、下划线组成的一串字符。
在Python中字符串有三种表示方法:
Python 中表示字符串的三种方式
关于字符串的一些拼接,截断,比较等方法这里就不列出了。可以去查 字符串方法 API.
List(列表)
Python 中可以通过组合一些值得到多种 复合 数据类型。其中最常用的列表 ,可以通过方括号括起、逗号分隔的一组值得到。一个列表可以包含不同类型的元素,但通常使用时各个元素类型相同。
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
print(list) # 输出完整列表
print(list[0]) # 输出列表的第一个元素
print(list[-1]) # 输出列表的最后一个元素
print(list[1:3]) # 输出第二个至第三个的元素
print(list[2:]) # 输出从第三个开始至列表末尾的所有元素
print(tinylist * 2) # 输出列表两次
print(list + tinylist) # 打印组合的列表
|
输出结果(注:加号 +
是列表连接运算符,星号 *
是重复操作)
1
2
3
4
5
6
7
| ['abcd', 786, 2.23, 'john', 70.2]
abcd
70.2
[786, 2.23]
[2.23, 'john', 70.2]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.2, 123, 'john']
|
Tuple(元组)
元组是另一个数据类型,类似于List(列表)。
元组用 ()
标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
tinytuple = (123, 'john')
print(tuple) # 输出完整元组
print(tuple[0]) # 输出元组的第一个元素
print(tuple[-1]) # 输出列表的最后一个元素
print(tuple[1:3]) # 输出第二个至第三个的元素
print(tuple[2:]) # 输出从第三个开始至列表末尾的所有元素
print(tinytuple * 2) # 输出元组两次
print(tuple + tinytuple) # 打印组合的元组
|
输出结果:
1
2
3
4
5
6
7
| ('abcd', 786, 2.23, 'john', 70.2)
abcd
70.2
(786, 2.23)
(2.23, 'john', 70.2)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.2, 123, 'john')
|
内置函数 len()
也可以作用到列表和元组上:
1
2
3
4
5
6
7
8
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
tinylist = [123, 'john']
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
print(len(tinylist))
print(len(tuple))
|
返回结果:
除了上面的 len()
函数外,对于列表和元组还可以使用如下内置函数:
cmp(tuple1, tuple2)
比较两个元组元素。max(tuple)
返回元组中元素最大值。min(tuple)
返回元组中元素最小值。tuple(seq)
将列表转换为元组。
当然,数组和元组也可以嵌套使用,可以成为二位数组甚至三维数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
list1 = [123, 'john']
tuple1 = ( 'abcd', 786 , 2.23, 'john', 70.2 )
list2 = [234, 'xiaoqiang']
tuple2 = ('dlc', 444)
list3 = ['sxdlc', tuple2, list2]
tuple3 = ('ddllcc', list1, tuple1)
print(list3)
print(tuple3)
|
返回结果:
1
2
| ['sxdlc', ('dlc', 444), [234, 'xiaoqiang']]
('ddllcc', [123, 'john'], ('abcd', 786, 2.23, 'john', 70.2))
|
Dictionary(字典)
字典 (dictionary) 是除列表以外 python 之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典用 { }
标识。字典由索引 (key) 和它对应的值 value 组成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print(dict['one']) # 输出键为'one' 的值
print(dict[2]) # 输出键为 2 的值
print(tinydict) # 输出完整的字典
print(tinydict.keys()) # 输出所有键
print(tinydict.values()) # 输出所有值
|
输出结果:
1
2
3
4
5
| This is one
This is two
{'name': 'john', 'code': 6734, 'dept': 'sales'}
dict_keys(['name', 'code', 'dept'])
dict_values(['john', 6734, 'sales'])
|
Python 数据类型转换
有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数 | 描述 |
---|
int(x [,base]) | 将x转换为一个整数 |
long(x [,base] ) | 将x转换为一个长整数 |
float(x) | 将x转换到一个浮点数 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 转换为可变集合 |
dict(d) | 创建一个字典。d 必须是一个序列 (key,value)元组。 |
frozenset(s) | 转换为不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
unichr(x) | 将一个整数转换为Unicode字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
Python 控制流程
条件语句
1
2
3
4
5
6
7
8
| if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
|
Python 要求严格的代码缩进,以 Tab 键或者 4 个空格进行缩进,不像 java 和 js 这种语言一样用小括号来界定执行体,而是使用 :
和缩进来界定。
if 语句的判断条件可以用 >
(大于)、<
(小于)、==
(等于)、>=
(大于等于)、<=
(小于等于)来表示其关系。
由于 python 并不支持 switch 语句,所以多个条件判断,只能用 elif 来实现,如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功;使用 and (与)时,表示只有两个条件同时成立的情况下,判断条件才成功。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
#if语句多个条件
num = 12
if num >= 0 and num <= 10: # 判断值是否在0~10之间
print ('[0---10]')
elif num < 20 or num > 10: # 判断值是否在小于0或大于10
print ('(10---20)')
else:
print ('>=20')
# 判断值是否在0~5或者10~15之间
if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):
print ('hello')
else:
print ('undefine')
|
针对前端开发的小朋友,我们来特别看一个示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
num = 1
str = "1"
if num == str:
print('num == str')
#elif num === str: 这是js语法,python中不存在
# print('num === str')
else:
print('not equal')
|
在 JavaScript 中有一个 ===
来表示判断类型的严格相等,而 ==
是会自动类型转换的抽象相等,需要注意的是在 Python 中的 ==
就是严格相等,这个和 Java/C++ 等这种语言一致。
按照 python 中的语法,修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
num = 1
str = "1"
if num == str:
print('num == str')
elif num == int(str):
print('num === str')
else:
print('not equal')
|
for 循环
1
2
3
4
5
6
7
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
computerLanguage = ['Java', 'C', 'C++', 'PHP', 'Python', 'Go', 'Swift', 'Object-C']
for language in computerLanguage:
print(language)
|
while 循环
1
2
3
4
5
6
7
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
i = 10;
while i > 0:
print(i)
i = i - 1
|
循环使用 else 语句
相对于我们熟知的 Java 和 JavaScript 这种语言,这个特性是 Python 所特有的,在 Java 中要实现这种逻辑我们往往需要添加一个额外的变量来记录结果,在 Python 中不需要。
while 语句中使用:
1
2
3
4
5
6
7
8
9
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
i = 10;
while(i > 0):
print(i)
i = i - 1
else:
print("<= 0")
|
for 语句中使用:
1
2
3
4
5
6
7
8
9
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
computerLanguage = ['Java', 'C', 'C++', 'PHP', 'Python', 'Go', 'Swift', 'Object-C']
for language in computerLanguage:
print(language)
else:
print("OtherLanguage")
|
break (跳出循环), continue(跳过本次循环), pass( 不做任何事情,一般用做占位语句)
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。
1
2
3
4
| def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
|
函数中的关键字参数和缺省参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
return;
#调用printinfo函数
printinfo( age=50, name="miki" );
printinfo( name="miki" );
|
函数中的不定长参数(不是很常用):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
|
当然了,Python 的函数也可以携带返回值,而且可以携带多个返回值。
1
2
3
4
5
6
7
8
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
def firstvalue(a,b):
c = a + b
return c
print(firstvalue(1, 2))
|
返回多个值:
1
2
3
4
5
6
7
8
9
10
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
def secondvalue(a,b):
c = a + b
return (a,b,c)
x, y, z = secondvalue(1,2)
print('x:', x, 'y:', y, 'z:', z)
|
Python 面向对象
理解面向对象编程
万事万物皆对象
我们从窗户向外望去:每棵树:每一课树都可以看成一个对象。路上每个人:每一个人也可以看成一个对象。每个人上班的事件: 可以看成一个对象。
类和对象
类则是从某一部分对象中抽象出来的一个群体,这些群体具有某些共同的特征,我们可以根据我们所需的某几个特征抽象出我们自己想要的类。
每个人都是对象,我们可以抽象出来人的共同特征,就像我们给自然界的物质分类一样(如何分类?根据特征分类)。
每个人上班的事件是对象,我们可以抽象出来上班,上班和上课就是两个类。
创建 Python 中的类和对象
创建一个 Person 类:
1
2
3
4
5
6
7
8
9
10
| class Person:
#特殊方法,构造函数,创建这个类的时候会首先调用
def __init__(self, name, age):
self.name = name
self.age = age
#定义一个方法,显示人的信息
def displyPersonInfor(self):
print("name:", self.name, ", age:", self.age)
|
创建对象(对象就是类的具体实例):
1
| person = Person("xiaoming", 22)
|
访问属性及方法:
1
2
3
4
| person.displyPersonInfor() #访问类的成员方法
print(person.name) #访问类的属性
print(person.age)
|
python 对象销毁(垃圾回收)
析构函数 del ,del 在对象销毁的时候被调用,当对象不再被使用时,del 方法运行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
class Person:
#特殊方法,构造函数,创建这个类的时候会首先调用
def __init__(self, name, age):
self.name = name
self.age = age
#定义一个方法,显示人的信息
def displyPersonInfor(self):
print("name:", self.name, ", age:", self.age)
#析构函数,对象销毁的时候调用
def __del__(self):
print(self.__class__.__name__ + "销毁")
xiaoming = Person("xiaoming", 22)
xiaoming.displyPersonInfor() #访问类的成员方法
xiaoqiang = Person("xiaoqiang", 25)
xiaoqiang.displyPersonInfor()
del xiaoming
del xiaoqiang
|
这里的 del
属于 python 的关键字,del
删除的是变量,而不是数据,解除了变量和数据的联系,例如:
1
2
3
4
5
6
7
8
9
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
a = 1
b = a
del a
print('b = ', b)
print('a = ', a)
|
打印结果:
1
2
3
4
5
| b = 1
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/test.py", line 9, in <module>
print('a = ', a)
NameError: name 'a' is not defined
|
使用 del
解除这种引用关系之后, Python 是自带垃圾回收的,会自动回收内存,所以你不必担心。
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
继承语法 class 派生类名(基类名):
基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
class Person:
#特殊方法,构造函数,创建这个类的时候会首先调用
def __init__(self, name, age):
self.name = name
self.age = age
#定义一个方法,显示人的信息
def displyPersonInfor(self):
print("name:", self.name, ", age:", self.age)
#析构函数,对象销毁的时候调用
def __del__(self):
print(self.__class__.__name__ + "销毁")
class Student(Person):
def __init__(self, name, age, grade):
Person.__init__(self, name, age)
self.grade = grade
def displyPersonInfor(self):
print("i am a student, my name is " + self.name)
def __del__(self):
print("student析构函数调用")
xiaoming = Person("xiaoming", 22)
xiaoming.displyPersonInfor() #访问类的成员方法
xiaoqiang = Student("xiaoqiang", 25, 3)
xiaoqiang.displyPersonInfor()
del xiaoming
del xiaoqiang
|
我们都知道面向对象的四大特性:抽象、继承、封装、多态。上面已经完美的体现出了抽象、继承、和封装,那么多态是什么呢?多态是面向对象中继承带来的第二大好处,这个好处可以极大的提高我们的代码耦合度和可维护性,让我们面向抽象编程而不是具体的实现。
爬虫介绍
说起爬虫应该大部分人都听过,这个东西入门很容易,但是随着学习的深入坑也是很深的,爬虫说白了就是抓取网页数据,我们先来看看一个纯静态的网页的抓取过程。
首先,我们安装一个 requests 模块,通过 pip
安装:
我们编写一个最简单的爬虫,爬取我网站上的一个简单页面,代码如下:
1
2
3
4
5
6
7
8
9
10
| #!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
r = requests.get('https://dp2px.com/demo/image-alert/')
print('文本编码:', r.encoding)
print('响应状态码:', r.status_code)
print('字符串方式的响应体:', r.text)
|
没错,这就是最简单的爬虫了,我们后面将介绍如何去爬取复杂的页面并解析里面的有效数据。