python学习(一)—简明python教程

2016-04-12 15:59:47

1. 介绍
2. 安装Python
3. 最初的步骤
4. 基本概念
5. 运算符与表达式
6. 控制流
7. 函数
8. 模块
9. 数据结构
10. 解决问题——编写一个Python脚本
11. 面向对象的编程
12. 输入/输出
13. 异常
14. Python标准库
15. 更多Python的内容

补充:简单的python爬虫程序

 

一、介绍

Python语言简单易学,功能强大,是一种解释性语言。它注重的是如何解决问题而不是编程语言的语法和结构,有高效率的高层数据结构。python语言在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。  

Python的特色:
简单
    阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
易学
    Python有极其简单的语法,及其容易上手。
免费、开源
    你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。
高层语言
    当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
可移植性
    由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在许多个平台上面运行。
解释性
    一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。
    Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。
面向对象
Python即支持面向过程的编程也支持面向对象的编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。
可扩展性
如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
可嵌入性
你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
丰富的库
Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。
除了标准库以外,还有许多其他高质量的库,如wxPython、 Twisted和Python图像库等等。
总之,Python确实是一种十分精彩又强大的语言。它合理地结合了高性能与使得编写程序简单有趣的特色。


二、安装
windows系统,从官网下载安装包(如版本2.7),注意环境变量的配置。

注意:下面的介绍是对于python 2.x的版本,3.x的版本有所修改。

三、最初的步骤

挑选一个编辑器:windows下可以用IDLE,具备语法加亮功能,支持文本缩进,这对于我们来说极其重要。大型的python程序可以用IDE,如PyCharm。linux下可以用vim。

>>> print'hello world'
hello world
>>> 

想要获得print命令的帮助文档:

 

当然使用HTML帮助文件也很方便。

注意:Python是大小写敏感的,即print与Print不一样——注意前一个是小写p而后一个是大写P。另外,确保在每一行的开始字符前没有空格或者制表符——我们将在后面讨论为什么这点是重要的。

四、基本概念

字面意义上的常量
  一个字面意义上的常量的例子是如同5、1.23、9.25e-3这样的数,或者如同'hello world'、 "It's a string!"这样的字符串。它们被称作字面意义上的,因为它们具备字面的意义——你按照它们的字面意义使用它们的值。


整数、长整数、浮点数和复数:
● 2是一个整数的例子;
● 长整数不过是大一些的整数;
● 3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4
● (-5+4j)和(2.3-4.6j)是复数的例子。

字符串
字符串是字符的序列 。字符串基本上就是一组单词。
● 使用单引号(')
你可以用单引号指示字符串,就如同'hello world'这样。所有的空白,即空格和制表符都照原样保留。
● 使用双引号(")
在双引号中的字符串与单引号中的字符串的使用完全相同,例如"What's your name?"。
● 使用三引号('''或""")
利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:

>>> print '''This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''
This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."

转义符
假设你想要在一个字符串中包含一个单引号('),那么你该怎么指示这个字符串?

例如,这个字符串是What's your name?。你肯定不会用'What's your name?'来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明这是单引号而不是字符串的结尾。可以用\'来指示单引号——注意这个反斜杠。现在你可以把字符串表示为'What\'s your name?'。
同样的,若想表达"What's your name?",字符串表示为'What\”s your name?'。另外,你可以用转义符\\来指示反斜杠本身。
值得注意的一件事是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。例如:

>>> print "This is the first sentence.\
This is the second sentence."
This is the first sentence.This is the second sentence.

自然字符串
如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自然字符串。
自然字符串通过给字符串加上前缀r或R来指定。例如:

>>> print r"Newlines are indicated by \n"
Newlines are indicated by \n

Unicode字符串
Unicode是书写国际文本的标准方法。Python允许你处理Unicode文本——你只需要在字符串前加上前缀u或U。例如,u"This is a Unicode string."。
记住,在你处理文本文件的时候使用Unicode字符串,特别是当你知道这个文件含有用非英语的语言写的文本。

字符串是不可变的
这意味着一旦你创造了一个字符串,你就不能再改变它了。虽然这看起来像是一件坏事,但实际上它不是。我们将会在后面的程序中看到为什么我们说它不是一个缺点。

按字面意义级连字符串
如果你把两个字符串按字面意义相邻放着,他们会被Python自动级连。例如:

>>> print 'What\'s' 'your name?'
What'syour name?

注意:
1、在Python中没有专门的char数据类型,确实没有需要有这个类型。
2、单引号和双引号字符串是完全相同的——它们没有在任何方面有不同。
3、一定要用自然字符串处理正则表达式。否则会需要使用很多的反斜杠。例如,后向引用符可以写成'\\1'或r'\1'。

变量
仅仅使用字面意义上的常量很快就会引发烦恼——我们需要一种既可以储存信息 又可以对它们进行操作的方法。变量就是我们想要的东西——它们的值可以变化,即你可以使用变量存储任何东西。变量只是你的计算机中存储信息的一部分内存。与字面意义上的常量不同,你需要一些能够访问这些变量的方法,因此你给变量名字。

注意:使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。

>>> i=5
>>> i=i+1
>>> print i
6

标识符的命名
变量是标识符的例子。 标识符是用来标识某样东西的名字。在命名标识符的时候,你要遵循这些规则:
● 标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _’)。
● 标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字(0-9)组成。
● 标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。注意前者中的小写n和后者中的大写N。
● 有效标识符名称的例子有i、__my_name、name_23和a1b2_c3。
● 无效标识符名称的例子有2things、this is spaced out和my-name。

数据类型
变量可以处理不同类型的值,称为数据类型。基本的类型是数和字符串,我们已经讨论过它们了。在后面的章节里面,我们会研究怎么用类创造我们自己的类型。

对象
记住,Python把在程序中用到的任何东西都称为对象 。这是从广义上说的。因此我们不会说“某某东西 ”,我们说“某个对象 ”。
逻辑行与物理行
物理行是你在编写程序时所看见的。逻辑行是Python 看见的单个语句。Python假定每个物理行对应一个逻辑行 。
逻辑行的例子如print 'Hello World'这样的语句——如果它本身就是一行(就像你在编辑器中看到的那样),那么它也是一个物理行。
默认地,Python希望每行都只使用一个语句,这样使得代码更加易读。
如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法。分号表示一个逻辑行/语句的结束。如将

i = 5
print i

写成

i = 5;print i;

同样,前面介绍了在多个物理行中写一个逻辑行的例子(它被称为明确的行连接,下面还有暗示的行连接)。
s = 'This is a string. \
This continues the string.'
缩进
空白在Python中是重要的。事实上行首的空白是重要的,它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。
这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。我们将在后面的章节中看到有关块的用处的例子。
注意:错误的缩进会引发错误。例如:print前面加了一个空格

>>> i=5
>>>  print i
 
  File "<pyshell#22>", line 2
    print i
    ^
IndentationError: unexpected indent

如何缩进
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。强烈建议在每个缩进层次使用单个制表符或两个或四个空格。
选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即只使用这一种风格。

五、运算符与表达式

大多数语句(逻辑行)都包含表达式。一个简单的表达式例子如2 + 3。一个表达式可以分解为运算符和操作数。运算符的功能是完成某件事,它们由如+这样的符号或者其他特定的关键字表示。运算符需要数据来进行运算,这样的数据被称为操作数 。在这个例子中,2和3是操作数。
运算符与他们的用法 

 

注意取模运算和按位反转(用到了补码)

运算符优先级
建议使用圆括号来分组运算符和操作数,以便能够明确地指出运算的先后顺序,使程序尽可能地易读。例如,2 + (3 * 4)显然比2 + 3 * 4清晰。与此同时,圆括号也应该正确使用,而不应该用得过滥(比如2 + (3 + 4)),同样也可使用圆括号改变计算顺序,类似(2 + 3) * 4。

结合规律
运算符通常由左向右结合,即具有相同优先级的运算符按照从左向右的顺序计算。例如,2 +3 + 4被计算成(2 + 3) + 4。一些如赋值运算符那样的运算符是由右向左结合的,即a = b = c被处理为a = (b = c)。

六、控制流

在Python中有三种控制流语句——if、for和while。

if语句
if语句用来检验一个条件, 如果条件为真,我们运行一块语句(称为 if-块 ), 否则我们处理另外一块语句(称为 else-块 )。 else 从句是可选的。

number = 23
guess = int(raw_input('Enter an integer : '))
if guess == number:
    print 'Congratulations, you guessed it.'  # New block starts here
    print "(but you do not win any prizes!)"  # New block ends here
elif guess < number:
    print 'No, it is a little higher than that'  # Another block
    # You can do whatever you want in a block ...
else:
    print 'No, it is a little lower than that'
    # you must have guess > number to reach here

print 'Done'

结果:

Enter an integer : 24
No, it is a little lower than that
Done

它如何工作的呢?
我们为内建的raw_input函数提供一个字符串,这个字符串被打印在屏幕上,然后等待用户的输入。一旦我们输入一些东西,然后按回车键之后,函数返回输入。对于raw_input函数来说得到是一个字符串。我们通过int把这个字符串转换为整数,并把它存储在变量guess中,这个是用户猜测的数字。
事实上,int是一个类,不过你想在对它所需了解的只是它把一个字符串转换为一个整数(假设这个字符串含有一个有效的整数文本信息)。
接下来,我们将用户的猜测与我们选择的数做比较。如果他们相等,我们打印一个成功的消息。注意我们使用了缩进层次来告诉Python每个语句分别属于哪一个块。这就是为什么缩进在Python如此重要的原因。
注意if语句在结尾处包含一个冒号——我们通过它告诉Python下面跟着一个语句块。
然后,我们检验猜测是否小于我们的数,如果是这样的,我们告诉用户它的猜测大了一点。这里使用的是elif从句,它事实上把两个相关联的if else-if else语句合并为一个if-elif-else语句。这使得程序更加简单,并且减少了所需的缩进数量。
elif和else从句都必须在逻辑行结尾处有一个冒号,下面跟着一个相应的语句块(当然还包括正确的缩进)。
你也可以在一个if块中使用另外一个if语句,等等——这被称为嵌套的if语句。
在Python执行完一个完整的if语句以及与它相关联的elif和else从句之后,它移向if语句块的下一个语句。在这个例子中,这个if语句块是主块。程序从主块开始执行,而下一个语句是print 'Done'语句。

while语句
只要在一个条件为真的情况下,while语句允许你重复执行一块语句。while语句是所谓循环语句的一个例子。while语句有一个可选的else从句。

number = 23
running = True
while running:
    guess = int(raw_input('Enter an integer : '))
    if guess == number:
        print 'Congratulations, you guessed it.'
        running = False # this causes the while loop to stop
    elif guess < number:
        print 'No, it is a little higher than that'
    else:
        print 'No, it is a little lower than that'
else:
    print 'The while loop is over.'
# Do anything else you want to do here
print 'Done'

结果:

Enter an integer : 24
No, it is a little lower than that
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

在这个程序中,我们仍然使用了猜数游戏作为例子,但是这个例子的优势在于用户可以不断的猜数,直到他猜对为止——这样就不需要像前面那个例子那样为每次猜测重复执行一遍程序。
else块事实上是多余的,因为你可以把其中的语句放在同一块(与while相同)中,跟在while语句之后,这样可以取得相同的效果。

for循环
for..in是另外一个循环语句,它在一序列的对象上递归,即逐一使用队列中的每个项目。我们会在后面介绍序列。

for i in range(1, 5):
    print i
else:
    print 'The for loop is over'

结果:

1
2
3
4
The for loop is over

在这个程序中,我们打印了一个序列的数。我们使用内建的range函数生成这个数的序列。
range返回一个序列的数。这个序列从第一个数开始到第二个数为止,例如:
range(1,5)给出序列[1, 2, 3, 4]。默认地,range的步长为1。如果我们为range提供第三个数,那么它将成为步长。例如,range(1,5,2)给出[1,3]。
for循环在这个范围内递归——for i in range(1,5)等价于for i in [1, 2, 3, 4],把序列中的每个数(或对象)赋值给i,一次一个,然后以每个i的值执行这个程序块。
记住,else部分是可选的。如果包含else,它总是在for循环结束后执行一次,除非遇到break语句。
for..in循环对于任何序列都适用。这里我们使用的是一个由内建range函数生成的数的列表,但是广义说来我们可以使用任何种类的由任何对象组成的序列!
Python的for循环与Java 1.5中的for (int i : IntArray)相似。

break语句
break语句是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句。
注意,如果你从for或while循环中终止 ,任何对应的循环else块将不执行

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
       break
    print 'Length of the string is', len(s)
print 'Done'

结果:

Enter something : hello
Length of the string is 5
Enter something : quit
Done

在这个程序中,我们反复地取得用户地输入,然后打印每次输入地长度。我们提供了一个特别的条件来停止程序,即检验用户的输入是否是'quit'。通过终止循环到达程序结尾来停止程序。
输入字符串的长度通过内建的len函数取得。break语句也可以在for循环中使用。

continue语句
continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        continue
    print 'Input is of sufficient length'

结果:

Enter something : a
Enter something : ab
Enter something : abc
Input is of sufficient length
Enter something : abcd
Input is of sufficient length
Enter something : quit

如果长度小于3,我们将使用continue语句忽略块中的剩余的语句。否则,这个循环中的剩余语句将被执行。continue语句对于for循环也有效。

七、函数

简介
函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为调用 函数。我们已经使用了许多内建的函数,比如len和range。
函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。

def sayHello():
    print 'Hello World!' # block belonging to the function
    
sayHello() # call the function

结果:

Hello World!

上面定义了一个称为sayHello的函数。这个函数不使用任何参数,因此在圆括号中没有声明任何变量。参数对于函数而言,只是给函数的输入,以便于我们可以传递不同的值给函数,然后得到相应的结果。

函数形参
函数取得的参数是你提供给函数的值,这样函数就可以利用这些值做 一些事情。这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值。
参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。注意我们使用过的术语——函数中的参数名称为形参 而你提供给函数调用的值称为实参 。

def printMax(a, b):
    if a > b:
        print a, 'is maximum'
    else:
        print b, 'is maximum'
        
printMax(3, 4) # directly give literal values

结果:

4 is maximum

局部变量
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是局部的。这称为变量的作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。

def func(x):
    print 'x is', x
    x = 2
    print 'Changed local x to', x
    
x = 50
func(x)
print 'x is still', x

结果:

x is 50
Changed local x to 2
x is still 50

global语句
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是全局 的。我们使用global语句完成这一功能。

def func():
    global x
    print 'x is', x
    x = 2
    print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x

结果:

x is 50
Changed local x to 2
Value of x is 2

global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。

默认参数值
对于一些函数,你可能希望它的一些参数是可选的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。
注意,默认参数值应该是不可变的。

def say(message, times = 1):
    print message * times
    
say('Hello')
say('World', 5)

结果:

Hello
WorldWorldWorldWorldWorld

注意:只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=5)是有效的,但是def func(a=5, b)是无效的。

关键参数
如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。

def func(a, b=5, c=10):
    print 'a is', a, 'and b is', b, 'and c is', c
func(3, 7)
func(25, c=24)
func(c=50, a=100)

结果:

a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50

return语句
return语句用来从一个函数返回,即跳出函数。我们也可选从函数返回一个值 。

def maximum(x, y):
    if x > y:
        return x
    else:
        return y
print maximum(2, 3)

结果返回3

注意,没有返回值的return语句等价于return None。None是Python中表示没有任何东西的特殊类型。
除非你提供你自己的return语句,每个函数都在结尾暗含有return None语句。通过运行print
someFunction(),你可以明白这一点,函数someFunction没有使用return语句。

另外提一点,pass语句在Python中表示一个空的语句块,不做任何事情。它一般用做占位语句,是为了保持程序结构的完整性。

DocStrings
文档字符串 ,通常被简称为 docstrings 。DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂,你应该尽量使用它。你甚至可以在程序运行的时候,从函数恢复文档字符串!

def printMax(x, y):
    '''Prints the maximum of two numbers.

    The two values must be integers.'''
    x = int(x) # convert to integers, if possible
    y= int(y)
    if x > y:
        print x, 'is maximum'
    else:
        print y, 'is maximum'

printMax(3, 5)
print printMax.__doc__

结果:

5 is maximum
Prints the maximum of two numbers.

    The two values must be integers.

文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。 强烈建议对你所写的任何正式函数编写文档字符串,并遵循这个惯例。随你的Python发行版附带的pydoc命令,与help()类似地使用DocStrings。

 

posted @ 2016-08-31 11:02  mutianzhixi  阅读(339)  评论(0编辑  收藏  举报