title: 基础知识 create: 2016.12.7 modified: 2016.12.7 tags: python basics

  1

[TOC]

大家好!为了能够更系统地了解Python,我开始学习各种教程。为了及时将所学内容和大家分享,同时巩固知识,我决定写这个Python教程。

1 安装Python

1.1 windows

(1) 从 http://www.python.org 下载Python安装包 (2) 双击运行Python的Windows Installer,这样会开启Python的安装向导,只需要接受默认设置。

1.2 Linux

在绝大多数Linux系统中,Python的解释器就已经存在。如果读者需要自己安装Python,可以使用Linux中的包管理器进行安装。如果使用的操作系统为Debian Linux, 那么可以用下面的命令来安装Python:
\$ apt-get install python 如果是RedHat Linux,则使用: \$ yum install python

2 Python交互式解释器

当启动Python的时候,会出现和下面类似的提示:
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information.
>>>
试着输入下面的命令看看它是否正常工作:


In [1]:
print 'Hello, world!'


Hello, world!

发生了什么?那个>>>符号就是提示符,可以在后面写上Python语句,比如print 'Hello, world!'。如果按下回车,Python解释器会打印出'Hello, world!'字符串。接下来先从一些简单的Python语句开始,看看能用它们做些什么。

3 数据和表达式

交互式Python解释器可以当作非常强大的计算器使用,试试以下的例子:


In [2]:
1/2


Out[2]:
0

发生了什么?一个整数被另外一个整数除,计算结果的小数部分被截除了,只留下整数部分。这里提供两个有效的解决方案:要用实数(包含小数点的十进制数)进行运算,或让Python改变除法的执行方式。
实数在Python中被称为浮点数(Float,或者Float-point Number),如果参与除法的两个数中有一个数为浮点数,结果亦为浮点数:


In [3]:
1.0/2.0


Out[3]:
0.5

In [4]:
1.0/2


Out[4]:
0.5

如果希望Python只执行普通的除法,那么可以在程序前加上以下语句,或者直接在解释器里执行它:


In [6]:
from __future__ import division

In [7]:
1/2


Out[7]:
0.5

通过使用上述方法,除法会变得更为合理。上述代码中future前后是两个下划线,以后会对future模块进行深入的介绍。Python还提供了另外一种用于实现整除的操作符-双斜线:


In [8]:
1//2


Out[8]:
0

就算是浮点数,双斜线也会执行整除:


In [9]:
1.0//2.0


Out[9]:
0.0

还有一个非常有用的运算符:


In [10]:
1%2


Out[10]:
1

这是取余运算符—x%y的结果为x除以y的余数。最后一个运算符就是幂(乘方)运算符:


In [11]:
2**3


Out[11]:
8

4 变量

Python中的变量很好理解,基本上就是代表某值的名字(变量名可以包括字母、数字和下划线,不能以数字开头)。举例来说,如果希望x代表3,只需执行下面的语句即可:


In [12]:
x=3

这样的操作称为赋值,值3赋给了变量x。在变量被赋值之后,就可以在表达式中使用变量。


In [13]:
x*2


Out[13]:
6

多个赋值操作可以同时进行:


In [3]:
x,y,z=1,2,3
print x, y, z


1 2 3

将表达式运算符(+、-、*、/等)放置在赋值运算符(=)的左边,这种写法叫做增量赋值:


In [4]:
x=2
x+=1
x*=2
x


Out[4]:
6

增量赋值可以让代码更加紧凑和简练,很多情况下会更易读。

5 语句

上面我已经介绍了两类语句:print语句和赋值语句。那么语句和表达式之间有什么区别呢?表达式是某事,而语句是做某事(换句话说就是告诉计算机做什么)。比如2*2是4,而print 2*2打印4。事实上print打印多个表达式也是可行的。


In [2]:
print 'Age', 42  #使用逗号隔开


Age 42

6 获取用户输入

怎么获取用户提供的值呢?看看非常有用的input函数吧。


In [14]:
x=input("x:")


x:20

In [15]:
y=input("y:")


y:31

In [16]:
print x*y


620

输入的值20和31由用户提供,而程序

7 函数

函数就像可以用来实现特定功能的小程序一样。我们通常把标准函数称为内建函数。比如使用abs函数可以得到数的绝对值,round函数则会把浮点数四舍五入为最接近的整数值:


In [1]:
abs(-10)


Out[1]:
10

In [2]:
round(0.4)


Out[2]:
0.0

8 模块

可以把模块想象成导入到Python中以增强其功能的扩展。需要使用特殊的命令import来导入模块。比如floor函数(向下取整)就在名为math的模块中:


In [4]:
import math
math.floor(2.9)


Out[4]:
2.0

如果想把2.9转化为整数而不是浮点数,可以使用int函数:


In [5]:
int(math.floor(2.9))


Out[5]:
2

在确定自己不会导入多个同名函数(从不同模块导入)的情况下,你可能不希望在每次调用函数的时候,都要写上模块的名字。那么,可以使用import命令的另外一种形式:


In [6]:
from math import sqrt
sqrt(9)


Out[6]:
3.0

事实上,可以使用变量来引用函数。比如,通过foo=math.sqrt进行赋值,然后就可以使用foo来计算平方根了:foo(4)的结果为2.0。也可以为函数提供别名:from math import sqrt as foobar

9 保存并执行程序

交互式解释器是Python的强项之一,它让实时检验解决方案并且体验这门语言成为了现实。但是,在交互式解释器里面输入的一切都会在它退出的时候丢失。我们真正想做的事情是编写自己和他人都能运行的程序。如何实现呢?
首先,需要一个文本编辑器。然后将程序保存在以.py结尾的文本文件中。如果使用Python解释器可通过Edit->Run或者按下Ctrl+F5键来运行程序。如果使用DOS窗口或者Linux中的Shell提示符可通过运行以下命令执行脚本:python *.py

10 注释

井号(#)在Python中有特殊作用。在代码中输入它的时候,它右边的一切都会被忽略。比如:

# 打印圆的周长:
print 2*pi*radius

这里的第一行称为注释。为了让别人能够更容易理解程序,使用注释是非常有效的。

11 字符串

在程序中可以使用双引号将字符串括起来:


In [1]:
"Let's go!"


Out[1]:
"Let's go!"

也可以使用单引号将字符串括起来:


In [5]:
'Hello,world!'


Out[5]:
'Hello,world!'

In [3]:
'Let's go!'


  File "<ipython-input-3-572d1938a729>", line 1
    'Let's go!'
         ^
SyntaxError: invalid syntax

11.1 转义符号-反斜线

这时可以使用反斜线(\)对字符串中的引号进行转义。


In [4]:
'Let\'s go!'


Out[4]:
"Let's go!"

11.2 拼接字符串

Python中该怎么拼接字符串呢?就像进行加法运算一样:


In [6]:
"Hello, "+"world!"


Out[6]:
'Hello, world!'

11.3 字符串表示,str和repr

通过Python打印的字符串还是被引号括起来的。这是因为Python在打印值时会保持该值在Python代码中的状态。如果使用print语句,结果就不一样了:


In [8]:
10000L


Out[8]:
10000L

In [7]:
print "Hello, "+"world!"


Hello, world!

In [9]:
print 10000L


10000

可以看到,长整型数10000L被转换成了数字10000。但是,当你想知道一个变量的值时,可能会对它是整型还是长整型感兴趣。
我们在这里讨论的实际上是值被转换为字符串的两种机制。可以通过以下两个函数来实现这两种机制:一是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解;而repr会创建一个字符串,它以合法的Python表达式的形式来表达值。比如:


In [10]:
print repr('Hello, world!')


'Hello, world!'

In [11]:
print repr(10000L)


10000L

In [12]:
print str('Hello, world!')


Hello, world!

In [13]:
print str(10000L)


10000

简而言之,str、repr是将Python值转换为字符串的2种方法。函数str让字符串更易于阅读,而repr则把结果字符串转换为合法的Python表达式。

11.4 input和raw_input的比较


In [1]:
name=input('what is your name?')
print 'Hello, '+name+'!'


what is your name?Tom
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-46de911846e6> in <module>()
----> 1 name=input('what is your name?')
      2 print 'Hello, '+name+'!'

c:\python27\lib\site-packages\ipykernel\ipkernel.pyc in <lambda>(prompt)
    139             self._sys_eval_input = builtin_mod.input
    140             builtin_mod.raw_input = self.raw_input
--> 141             builtin_mod.input = lambda prompt='': eval(self.raw_input(prompt))
    142         self._save_getpass = getpass.getpass
    143         getpass.getpass = self.getpass

c:\python27\lib\site-packages\ipykernel\ipkernel.pyc in <module>()

NameError: name 'Tom' is not defined

问题在于input会假设用户输入的是合法的Python表达式。如果以字符串作为输入的名字,程序运行是没有问题的:


In [2]:
name=input('what is your name?')
print 'Hello, '+name+'!'


what is your name?'Tom'
Hello, Tom!

然而,要求用户带着引号输入他们的名字有点过分,因此,这就需要使用raw_input函数,它会把所有的输入当作原始数据,然后将其放入字符串中:


In [3]:
name=raw_input('what is your name?')
print 'Hello, '+name+'!'


what is your name?Tom
Hello, Tom!

除非对input有特别的需要,否则应该尽可能使用raw_input函数。

11.5 原始字符串

普通字符串可以跨行。如果一行之中最后一个字符是反斜线,那么,换行符本身就被“转义”了,也就是被忽略了,例如:


In [5]:
print 'hello, \
world!'


hello, world!

在普通字符串中,反斜线有特殊作用:它会转义,,可以在字符串中加入通常情况下不能直接加入的内容。例如,换行符可以写为\n,并可放于字符串中,如下:


In [8]:
print 'Hello,\nworld!'


Hello,
world!

这看起来不错,但是有时候,这并非是想要的结果。如果希望在字符串中包含反斜线再加上n怎么办?例如,像Windows路径"C:\nowhere"这样的字符串:


In [7]:
print 'C:\nowhere'


C:
owhere

这并不是期望的结果。那么该怎么办呢?可以使用反斜线对其本身进行转义:


In [9]:
print 'C:\\nowhere'


C:\nowhere

这看起来不错,但是对于长路径,那么可能需要很多反斜线。在这样的情况下,原始字符串就派上用场了。原始字符串不会把反斜线当作特殊字符。在原始字符串中输入的每个字符都会与书写的方式保持一致:


In [6]:
print r'C:\nowhere'


C:\nowhere

可以看到,原始字符串以r开头。不能在原始字符串结尾输入反斜线。如果最后一个字符是反斜线,Python就不清楚是否应该结束字符串:


In [10]:
print r'This is illegal\'


  File "<ipython-input-10-f19bd253ec0b>", line 1
    print r'This is illegal\'
                            ^
SyntaxError: EOL while scanning string literal

12 小结

本章讲了很多内容。在继续下一章之前,先来回顾一下在本章学到了什么: