Python基础知识总结

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))

返回结果:

1
2
2
5

除了上面的 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
pip install requests

我们编写一个最简单的爬虫,爬取我网站上的一个简单页面,代码如下:

 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)

没错,这就是最简单的爬虫了,我们后面将介绍如何去爬取复杂的页面并解析里面的有效数据。